Textview上的Recyclerview setOnClickListener更改另一行Textview的背景 [英] Recyclerview setOnClickListener on Textview changes background of another row 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屋!