【问题标题】:Get the internal details of the items in recycler view if the items are shuffeled如果项目被洗牌,则在 recyclerview 中获取项目的内部详细信息
【发布时间】:2017-02-20 20:05:14
【问题描述】:

我有一个回收站视图,其中包含列表。列表中的项目有自己的详细信息(每个项目都有图像、ID、名称、描述),并且项目被打乱,而不是按顺序排列。

示例:recyclerview item position = 0, list item id= 7.

recyclerview item position = 1, list item id= 5.

recyclerview item position = 2, list item id= 12.

所以我需要在点击时获取回收站上的列表项 ID。如果我单击 recyclerview 位置 = 0,如果我必须将项目 ID 设为 7。这样我就可以根据该 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 事件的需要向我提出建议。

【问题讨论】:

    标签: android onclick android-recyclerview adapter


    【解决方案1】:

    ViewHolder 里面的setOnClickListener 是个好办法。

    考虑到您当前的解决方案,最简单的方法是更改​​ ClickListener 接口,在 onBindViewHolder 期间将数据放入 Holder 中,然后在 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());
        }
    }
    

    【讨论】:

    • 那么我怎样才能获得项目ID?
    • inside id part of FeaturedAppsData ?
    • 实际上我正在使用 onclick 界面来获得另外两个回收站视图。因此,在 OnClick 方法中,如果我返回 FeaturedAppData 数据而不是 int 值,则会在单击操作时为其他两个回收器方法提供错误。
    • 我已经编辑了我的解决方案。现在它只传递 ID。
    • error [errors: ‘Could not find feed with the id ]。这是我在执行时得到的错误响应。表示它没有获取列表项的 id 值。也许它正在占据回收站视图项目的位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2019-01-18
    • 2023-03-07
    相关资源
    最近更新 更多