RecyclerView onClick问题

时间:2015-10-12 05:27:39

标签: android onclick android-recyclerview

我一直在研究RecyclerView,当用户点击某个项目时,我希望更改recyclerview面板。出于简单的测试目的,我在点击时将recyclelerview项目的文本设为红色。点击正确但当我滚动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);
    }


}

} `

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  

我在onBindViewHolder()

RecyclerView.Adapter方法中完成了此操作
@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特定视图

  

<强>解释

onBindViewHolder()课程的RecyclerView.Adapter方法中,您可以按View view = viewHolder.itemView;

获取ViewHolders课程视图

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