Textview上的Recyclerview setOnClickListener更改另一行Textview的背景 [英] Recyclerview setOnClickListener on Textview changes background of another row Textview

查看:76
本文介绍了Textview上的Recyclerview setOnClickListener更改另一行Textview的背景的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的RecyclerView就是这样

My RecyclerView is like this

当我单击F-0和S-0进行选择并更改背景时. 它还更改了背景颜色F-15和S-15.

When I Clicked on F-0 and S-0 for selection and changed background. It is also changed background color F-15 and S-15.

我的代码在这里.

MyRecyclerViewAdapter.java

MyRecyclerViewAdapter.java

public class MyRecyclerViewAdapter extends RecyclerView
    .Adapter<MyRecyclerViewAdapter
    .DataObjectHolder> {
private static String LOG_TAG = "MyRecyclerViewAdapter";
private ArrayList<DataObject> mDataset;
private static MyClickListener myClickListener;


public static class DataObjectHolder extends RecyclerView.ViewHolder
        implements View
        .OnClickListener {
    TextView label;
    TextView dateTime;

    public DataObjectHolder(View itemView) {
        super(itemView);
        label = (TextView) itemView.findViewById(R.id.textView);
        dateTime = (TextView) itemView.findViewById(R.id.textView2);
        Log.i(LOG_TAG, "Adding Listener");
        itemView.setOnClickListener(this);
        label.setOnClickListener(this);
        dateTime.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        if(v.getId() == label.getId()){
            label.setBackgroundColor(Color.parseColor("#FFFF00"));

        }else if(v.getId() == dateTime.getId()){
            dateTime.setBackgroundColor(Color.parseColor("#0000FF"));
        }else{
            Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();

        }
        int position  = getAdapterPosition();
        Log.i(LOG_TAG, String.valueOf(position));
        myClickListener.onItemClick(position, v);
    }
}

public void setOnItemClickListener(MyClickListener myClickListener) {
    this.myClickListener = myClickListener;
}

public MyRecyclerViewAdapter(ArrayList<DataObject> myDataset) {
    mDataset = myDataset;
}

@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recyclerview_item, parent, false);

    DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
    return dataObjectHolder;
}

@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {


    holder.label.setText(mDataset.get(position).getmText1());
    holder.dateTime.setText(mDataset.get(position).getmText2());
}

public void addItem(DataObject dataObj, int index) {
    mDataset.add(dataObj);
    notifyItemInserted(index);
}

public void deleteItem(int index) {
    mDataset.remove(index);
    notifyItemRemoved(index);
}

@Override
public int getItemCount() {
    return mDataset.size();
}

public interface MyClickListener {
    public void onItemClick(int position, View v);
}

}

DataObject.java

DataObject.java

public class DataObject {
private String mText1;
private String mText2;

DataObject (String text1, String text2){
    mText1 = text1;
    mText2 = text2;
}

public String getmText1() {
    return mText1;
}

public void setmText1(String mText1) {
    this.mText1 = mText1;
}

public String getmText2() {
    return mText2;
}

public void setmText2(String mText2) {
    this.mText2 = mText2;
}

}

MainActivity.java

MainActivity.java

public class MainActivity extends AppCompatActivity {

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private static String LOG_TAG = "RecyclerViewActivity";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MyRecyclerViewAdapter(getDataSet());
    mRecyclerView.setAdapter(mAdapter);
    RecyclerView.ItemDecoration itemDecoration =
            new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
    mRecyclerView.addItemDecoration(itemDecoration);
}

@Override
protected void onResume() {
    super.onResume();
    ((MyRecyclerViewAdapter) mAdapter).setOnItemClickListener(new
          MyRecyclerViewAdapter.MyClickListener() {
              @Override
              public void onItemClick(int position, View v) {
                  Log.i(LOG_TAG, " Clicked on Item " + position);
              }
          });
}

private ArrayList<DataObject> getDataSet() {
    ArrayList results = new ArrayList<DataObject>();
    for (int index = 0; index < 20; index++) {
        DataObject obj = new DataObject("F-" + index,
                "S-" + index);
        results.add(index, obj);
    }
    return results;
}

}

那么,您能指导我如何选择仅一行的项目吗?

So, can you please guide me how to select item for only one row?

谢谢.

推荐答案

onBindViewHolder自由回收适配器使用的Views.

onBindViewHolder freely recycles Views used by the adapter.

因此,如果您有: DataObjectHolder X设置为View A,并且DataObjectHolder Y设置为View B 并且您更改了Holder X的背景,实际上是在View A上进行了更改,Holder Y然后可以使用相同的视图,从而显示错误的背景.

So if you had: DataObjectHolder X set to View A, and DataObjectHolder Y set to View B and you changed the background for Holder X, it actually changed it on View A, the same view can be then used by Holder Y, showing the wrong background.

因此,您需要做的是将状态存储在DataObjectHolder上,并在onBindViewHolder中检查状态并适当刷新背景颜色.

So what you need to do, is store the state on DataObjectHolder, and in onBindViewHolder check the state and refresh the background color appropriately.

ViewHolder:

public static class DataObjectHolder extends RecyclerView.ViewHolder
        implements View
        .OnClickListener {
    TextView label;
    TextView dateTime;
    int labelColor = Color.RED;
    int dateColor = Color.RED;

    public DataObjectHolder(View itemView) {
        super(itemView);
        ...
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == label.getId()) {
            labelColor = Color.BLUE;
        } else if(v.getId() == dateTime.getId()) {
            dateColor = Color.BLUE;
        } else {
            ...
        }
        adapter.notifyDataSetChanged(); 
        // or use notifyItemChanged(pos) if you know the position of the view
    }
}

Adapter代码中:

@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
    holder.label.setText(mDataset.get(position).getmText1());
    holder.dateTime.setText(mDataset.get(position).getmText2());

    // refresh the background color based on the value stored in holder:
    holder.label.setBackgroundColor(holder.labelColor);
    holder.dateTime.setBackgroundColor(holder.dateColor);
}

这篇关于Textview上的Recyclerview setOnClickListener更改另一行Textview的背景的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆