如何在RecyclerView中使用字符串?点击列表项始终显示首个字符串问题
问题分析与解决办法
嘿,我一眼就看出问题出在哪了!你在onCreateViewHolder里用viewType去取mData.get(viewType),这完全搞错了viewType的用途啊!
viewType是用来区分不同类型的Item布局的,比如你的RecyclerView里有两种不同样式的条目时才会用到它,它绝对不是当前条目的位置索引。所以你现在的代码里,不管哪个条目被点击,拿到的都是viewType对应位置的数据(通常默认viewType是0,所以一直取的是ArrayList里的第一个元素),这就导致所有点击都只显示第一个字符串。
正确的做法:在onBindViewHolder中处理点击事件
onBindViewHolder才是每个条目绑定数据的地方,这里的position参数才是当前条目的真实位置,我们应该在这里获取对应的数据并设置点击事件:
先看修改后的完整代码示例:
1. 你的ViewHolder类(假设包含显示文本的控件)
public class ViewHolder extends RecyclerView.ViewHolder { TextView itemText; public ViewHolder(View itemView) { super(itemView); itemText = itemView.findViewById(R.id.tv_item_text); // 替换成你自己的控件ID } }
2. 重写onCreateViewHolder(只负责创建ViewHolder,不要在这里处理数据和点击)
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(mContext).inflate(R.layout.cardview, parent, false); // 注意:这里不要设置点击事件,也不要获取mData里的数据 return new ViewHolder(v); }
3. 在onBindViewHolder中绑定数据+设置点击事件
@Override public void onBindViewHolder(ViewHolder holder, final int position) { // 这里通过position拿到当前条目的对应数据 final ContentMain contentMain = mData.get(position); // 先把数据绑定到控件上(比如设置文本) holder.itemText.setText(contentMain.getYourTargetString()); // 替换成你自己的字符串获取方法 // 给当前条目设置点击事件 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 这里直接用当前条目的contentMain对象,就能拿到正确的字符串了 Toast.makeText(v.getContext(), contentMain.getYourTargetString(), Toast.LENGTH_SHORT).show(); } }); }
为什么这样改?
onCreateViewHolder只会在创建新的ViewHolder时调用(比如RecyclerView刚加载,或者条目滚出屏幕需要复用的时候),它不负责对应具体条目的数据。onBindViewHolder会在每个条目需要显示数据时调用,这里的position就是当前条目的准确位置,拿到的数据自然是对的,点击时用这个数据就不会出错了。
这样修改后,你点击每个条目,就会显示对应位置的字符串啦!
内容的提问来源于stack exchange,提问作者Susan T. Erickson
相关产品推荐
相关产品推荐

