2017-02-20 23 views
0

У меня есть вид ресайклера, который состоит из списка. Элементы в списке имеют свои собственные данные, подобные этому (каждый элемент будет иметь изображение, идентификатор, имя, описание), и элементы будут перетасованы, а не в порядке.Получить внутреннюю информацию о товарах в ресайклере, если элементы перетасованы

Пример: recyclerview элемент позиция = 0, элемент списка ID = 7.

recyclerview пункт положение = 1, элемент списка ID = 5.

recyclerview положение пункта = 2, элемент списка ID = 12.

Так что мне нужно получить идентификатор элемента списка на recycler при щелчке. Если я нажму на позицию recyclerview = 0, если мне нужно получить идентификатор элемента как 7. Так что я могу работать на этом furthur на основе этого id.

Мой пример кода

recommendedrecyclerView=(RecyclerView)view.findViewById(R.id.recommended_recycler_view); 
    recommendedrecyclerView.setNestedScrollingEnabled(false); 
    recommendedrecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(),OrientationHelper.VERTICAL,true)); 
    recommendedrecyclerView.setItemAnimator(new DefaultItemAnimator()); 

Я получаю данные с сервера и установить его к адаптеру

setrecommendedAppsContent(response.body().getData()); 

    public void setrecommendedAppsContent(List<FeaturedAppsData> data){ 
    if (data!=null&&data.size()>0) { 
     recommendedAdapter = new RecommendedAdapter(mCurrentContext, data); 
     recommendedrecyclerView.setAdapter(recommendedAdapter); 
     recommendedAdapter.setClickListener(this); 
    } 
} 

Это мой адаптер класса

public class RecommendedAdapter extends RecyclerView.Adapter<RecommendedAdapter.ItemViewHolder> { 

private LayoutInflater inflater = null; 
private Context context; 
private List<FeaturedAppsData> itemsData; 
private ClickListener clicklistener = null; 
public TextView recommendedAppTitle,recommendedAppCategory,recommendedAppDescription; 
public ImageView recommendedAppIcon; 
Button recommendedBtn; 
String appId; 

public void setClickListener(ClickListener clickListener) { 
    this.clicklistener = clickListener; 
} 

public RecommendedAdapter(Context context, List<FeaturedAppsData> itemsData) { 
    this.context = context; 
    this.itemsData = itemsData; 
} 

@Override 
public void onBindViewHolder(ItemViewHolder holder, int position) { 
    holder.recommendedAppTitle.setText(itemsData.get(position).getName()); 
    holder.recommendedAppCategory.setText(itemsData.get(position).getApp_description()); 
    holder.recommendedAppDescription.setText(itemsData.get(position).getOffer_description()); 
    holder.recommendedAppBtn.setText(itemsData.get(position).getButton_text()); 
    String imageUrl = String.valueOf(itemsData.get(position).getImage().getUrl()); 
    Glide.with(context).load(ApiConstant.ApiBaseUrl + imageUrl).into(recommendedAppIcon); 
    appId=itemsData.get(position).getId(); 

} 

@Override 
public int getItemCount() { 
    int size = 0; 
    if (itemsData != null && itemsData.size() > 0) { 
     size = itemsData.size(); 

    } 
    return size; 
} 

public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    public TextView recommendedAppTitle,recommendedAppCategory,recommendedAppDescription,offerDescription,offerDetailDescription,rewardDetail; 
    public ImageView recommendedAppIcon; 
    public Button recommendedAppBtn; 
    public ArrayList<FeaturedAppsData> dataItems; 
    private Context context; 

    public ItemViewHolder(Context context, View itemView, int viewType) { 
     super(itemView); 
     this.context = context; 
     itemView.setOnClickListener(this); 

     recommendedAppTitle = (TextView) itemView.findViewById(R.id.recommended_app_title); 
     recommendedAppCategory = (TextView) itemView.findViewById(R.id.recommended_app_category); 
     recommendedAppDescription = (TextView) itemView.findViewById(R.id.recommended_app_description); 
     recommendedAppIcon = (ImageView) itemView.findViewById(R.id.recommended_app_icon); 
     recommendedAppBtn=(Button)itemView.findViewById(R.id.recommended_app_card_btn); 
    } 

    @Override 
    public void onClick(View v) { 

     if (clicklistener != null) { 
      clicklistener.itemClicked(v, getAdapterPosition()); 
     } 
    } 
} 


@Override 
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = null; 
    inflater = LayoutInflater.from(context); 
    view = inflater.inflate(R.layout.recommended_item_layout, parent, false); 
    recommendedAppIcon=(ImageView)view.findViewById(R.id.recommended_app_icon); 

    return new ItemViewHolder(context, view, viewType); 
} 

} 

Я не уверен, метод Onclick. Поэтому, пожалуйста, предложите мне по мере необходимости вместе с событием Onclick.

ответ

1

setOnClickListener внутри ViewHolder - хороший способ.

Учитывая ваше текущее решение, самый простой способ - изменить интерфейс ClickListener, поместить данные внутри держателя во время onBindViewHolder, а затем передать его слушателю во время onClick. Как это:

Изменить держатель вид поля на:

public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    public TextView recommendedAppTitle,recommendedAppCategory,recommendedAppDescription,offerDescription,offerDetailDescription,rewardDetail; 
    public ImageView recommendedAppIcon; 
    public Button recommendedAppBtn; 
    public FeaturedAppsData data; // <<< ADD THIS 
    // remove that u don't need public ArrayList<FeaturedAppsData> dataItems; 
    // remove that u don't need private Context context; 
    ... the rest of your holder 

затем внутри onBindViewHolder

@Override 
public void onBindViewHolder(ItemViewHolder holder, int position) { 
    holder.data = itemsData.get(position); 
    ... the rest on bind 

затем внутри onClick, внутри держателя:

@Override 
public void onClick(View v) { 

    if (clicklistener != null) { 
     clicklistener.itemClicked(v, data.getId()); 
    } 
} 
+0

так с этим, как можно Я получаю идентификатор элемента? –

+0

внутри идентификационной части 'FeaturedAppsData'? – Budius

+0

На самом деле, я использую интерфейс onclick для еще двух просмотров recycler. Поэтому в методе OnClick, если я возвращаю данные FeaturedAppData вместо значения int, он дает ошибку для других двух методов recycler при действиях кликов. –

 Смежные вопросы

  • Нет связанных вопросов^_^