首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView点击位置0也设置为点击位置11

RecyclerView点击位置0也设置为点击位置11
EN

Stack Overflow用户
提问于 2018-06-15 20:23:34
回答 5查看 1.3K关注 0票数 0

我在Fragment中使用RecyclerView。点击RecyclerView items也反映在另一个位置上,例如,如果我选择0位置位置11也被设置为选中,如果我选择1位置那么位置12也被设置为选中。

下面是我的适配器类。

代码语言:javascript
复制
 List<Data> dataList;
Context context;
public static OnItemClick click;

public void setClick(final OnItemClick click){
    Wkdapter.click =click;
}

下面是BindView方法

代码语言:javascript
复制
 @Override
public void onBindViewHolder(@NonNull Wkdapter.Holder holder, int position) {
    Data data=dataList.get(position);
    holder.tv_playername_create_team.setText(data.getName());

}

public static class Holder extends RecyclerView.ViewHolder{
    TextView tv_playername_create_team;
    public Holder(View itemView) {
        super(itemView);
        tv_playername_create_team=itemView.findViewById(R.id.tv_playername_create_team);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (click!=null){
                    int pos=getAdapterPosition();
                    if (RecyclerView.NO_POSITION!=pos){ ;
                        click.onClicked(itemView,pos);
                    }
                }
            }
        });
    }
}

这里我在片段中设置了Onclick

代码语言:javascript
复制
  Wkdapter.setClick(new OnItemClick() {
                @Override
                public void onClicked(View view,int position){
                    data=dataList.get(position);
                    result.onResult(data,view,position);
                }
            });

onResult方法

代码语言:javascript
复制
@Override
public void onResult(Data data, View view, int position){
   Log.e(tag,"Name "+data.getName());

}
EN

回答 5

Stack Overflow用户

发布于 2018-06-15 20:56:15

与我的经验类似,下面是我如何解决这个问题:

  1. onBindViewHolder()上设置onClick。确保您的onClick具有来自onBindViewHolder()position参数。不是从getAdapterPosition().
  2. In你的RecyclerView.Adapter,重写getItemId(int position)getItemViewType(int position)返回position。不要在那里做任何其他事情。

在我的例子中,它是有效的。

票数 1
EN

Stack Overflow用户

发布于 2018-06-15 20:39:18

看起来像是回收的ViewHolder有问题。在onBindViewHolder函数中将按钮设置为正确的状态。例如,如果单击状态存储在您的数据对象中:

代码语言:javascript
复制
@Override
public void onBindViewHolder(@NonNull Wkdapter.Holder holder, int position) {
    Data data=dataList.get(position);
    holder.tv_playername_create_team.setText(data.getName());
    click.onClicked(data.isClicked)
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-15 20:44:42

您将需要在数据类中维护选定的位置状态,如果没有维护状态,则在数据类中创建布尔isSelected变量,如果选中或取消选中,则还需要在onBindViewHolder中更新它。

代码语言:javascript
复制
 @Override
 public void onBindViewHolder(@NonNull Wkdapter.Holder holder, int position) 
 {
     Data data=dataList.get(position);

     if(data.isSelected()) {
//   Set icon of selected state
     } else {
//   Set icon of unselected state
     }

     holder.tv_playername_create_team.setText(data.getName());
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50875555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档