RecyclerView onClick问题

RecyclerView onClick problems

我一直在研究 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);
    }


}

} `

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

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

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
        });
    }

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

I have done this in onBindViewHolder() method of RecyclerView.Adapter class

@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 特定视图

Explanation

RecyclerView.Adapter class 的 onBindViewHolder() 方法中,您可以通过 View view = viewHolder.itemView;

获取 ViewHolders Class 查看

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