【问题标题】:RecyclerView onClick problemsRecyclerView onClick 问题
【发布时间】:2016-01-09 12:02:16
【问题描述】:

我一直在处理RecyclerView,当用户单击某个项目时,我希望更改 recyclerview 面板。出于简单测试的目的,我在点击时将 recyclerview 项目的文本设置为红色。单击正确,但是当我滚动RecyclerView 时,其他项目随机变为红色。这些随机项目没有被点击,当我滚动时它们自己变成红色。我认为我的问题应该出在onClick 方法中。

public class interestAdapter extends RecyclerView.Adapter<interestAdapter.MyViewHolder> {
private LayoutInflater inflater;
private Context context;
public ArrayList<String> data = new ArrayList();
public static MyViewHolder.ViewHolderClick click;
//public static MyViewHolder.ViewHolderClick click;



public interestAdapter(Context context, ArrayList<String> objects) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    for(int i = 0; i < objects.size(); i++) {
        data.add(objects.get(i));
    }
}

public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.interestpanel, parent, false);
    MyViewHolder holder = new MyViewHolder(view);
    return holder;

}

public int getItemCount() {
    return data.size();
}

public void setClickListener(MyViewHolder.ViewHolderClick clicker) {
    this.click = clicker;
}

public void onBindViewHolder(MyViewHolder holder, int position) {
    String current = data.get(position);
    holder.category.setText(current);


}

static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { //implements View.onClickListener {
    TextView category;
    public MyViewHolder(View itemView) {
        super(itemView);
        //itemView.setOnClickListener(this);

        category = (TextView) itemView.findViewById(R.id.category);
        category.setOnClickListener(this);


    }

    @Override
    public void onClick(View v) {

            MyViewHolder holder = new MyViewHolder(v);
            holder.category.setTextColor(Color.RED);

    }
    public TextView getCate() {
        return category;
    }

    public static interface ViewHolderClick {
        public void clicked(View view, int position);
    }


}

} `

【问题讨论】:

标签: android onclick android-recyclerview


【解决方案1】:

您需要将OnClick回调接口提供回调用活动或片段并更改那里的颜色。

【讨论】:

    【解决方案2】:

    问题很简单,因为我们知道回收器视图回收视图您已更改列表视图中一个视图的颜色该视图的颜色在您的情况下保持为红色。所以在绑定时如果没有以其他方式单击视图持有者,您需要将颜色更改回正常状态,您必须保持单击视图的位置并相应地更改颜色。

    【讨论】:

      【解决方案3】:

      RecyclerView 通过 myHolder 对象多次使用同一行引用。问题出在:

      MyViewHolder holder = new MyViewHolder(v);  //this holder has multiple reference in recyclerView
      holder.category.setTextColor(Color.RED);
      

      正如 Piyush 正确建议的那样,在模型中维护一个字段以供点击(布尔值)。并通过检查此布尔值来呈现点击。在您的 onclick 处更新布尔值

      我通常做的是:

      public void onBindViewHolder(final ContactViewHolder convosViewHolder, final int i) {
      
              convosViewHolder.name.setText(contacts.get(i).getName());
              convosViewHolder.phone.setText(contacts.get(i).getNumber());
      
              convosViewHolder.cv.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                     //turn red here
              });
          }
      

      你可以试试。希望有帮助。

      【讨论】:

        【解决方案4】:

        我在RecyclerView.Adapter 类的onBindViewHolder() 方法中做到了这一点

        @Override
        public void onBindViewHolder(final MyRecyclerViewAdapter.MyViewHolder viewHolder, final int position) {
        
            final MyModel myModel = mMyModelArrayList.get(position);
            viewHolder.aTextView.setText(myModel.getA());
        
        
            View view = viewHolder.itemView;
        
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(mContext, "View where A: " + myModel.getA() + " is Clicked", Toast.LENGTH_SHORT).show();
                }
            });
        
        }
        

        Imp Part

        不要忘记在 RecyclerViews 布局中添加 android:clickable="true"android:focusable="true",即父布局

        例如:

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:focusable="true">
        

        通过这种方式,您可以启用单击您的 RecyclerViews 特定视图

        说明

        RecyclerView.Adapter 类的onBindViewHolder() 方法中,您可以通过View view = viewHolder.itemView; 获取ViewHolders 类视图

        因此,通过使用该视图,您可以为 RecyclerView 的特定项目单击设置 onClick 事件

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-24
          • 1970-01-01
          • 2016-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-27
          • 2019-03-11
          相关资源
          最近更新 更多