我正在使用RecyclerView,我有一个SubmitButton,当我单击SubmitButton时,我正在更改子视图项的背景。当我滚动recyclerview时,项目背景颜色变为默认颜色,如何解决此错误。
这是我的适配器
public class ItemArrayAdapter extends RecyclerView.Adapter<ItemArrayAdapter.ViewHolder> {
//All methods in this adapter are required for a bare minimum recyclerview adapter
private int listItemLayout;
private ArrayList<Item> itemList;
// Constructor of the class
public ItemArrayAdapter(int layoutId, ArrayList<Item> itemList) {
listItemLayout = layoutId;
this.itemList = itemList;
}
// get the size of the list
@Override
public int getItemCount() {
return itemList == null ? 0 : itemList.size();
}
// specify the row layout file and click for each row
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(listItemLayout, parent, false);
ViewHolder myViewHolder = new ViewHolder(view);
return myViewHolder;
}
// load data in each row element
@Override
public void onBindViewHolder(final ViewHolder holder, final int listPosition) {
TextView item = holder.item;
item.setText(itemList.get(listPosition).getName());
holder.setIsRecyclable(false);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
// Static inner class to initialize the views of rows
static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView item;
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
item = (TextView) itemView.findViewById(R.id.row_item);
}
@Override
public void onClick(View view) {
Log.d("onclick", "onClick " + getLayoutPosition() + " " + item.getText());
}
}
}
我的活动
public class FourthActivity extends AppCompatActivity {
RecyclerView recyclerView;
Button button;
int currentVisibleItem = 0;
private LinearLayoutManager linearLayoutManager;
private boolean programaticallyScrolled;
ImageView img_LeftScroll, img_right_scroll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.table_layout);
ArrayList<Item> itemList = new ArrayList<>();
itemList.add(new Item("Item 1"));
itemList.add(new Item("Naveen"));
itemList.add(new Item("Raj"));
itemList.add(new Item("Kumar"));
itemList.add(new Item("Mutharasi"));
itemList.add(new Item("Mutharasi"));
itemList.add(new Item("John"));
itemList.add(new Item("Peeter"));
itemList.add(new Item("Son"));
final ItemArrayAdapter itemArrayAdapter = new ItemArrayAdapter(R.layout.list_item, itemList);
recyclerView = (RecyclerView) findViewById(R.id.rvs);
recyclerView.setHasFixedSize(true);
linearLayoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(itemArrayAdapter);
img_LeftScroll = findViewById(R.id.leftimage);
img_right_scroll = findViewById(R.id.imageView12);
button=findViewById(R.id.submit_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View row=linearLayoutManager.findViewByPosition(2);
row.setBackgroundColor(getResources().getColor(R.color.blue));
Log.d("onclick", "onClick color changer " );
}
});
}
}
Here is my example clip 如何解决此错误。
答案 0 :(得分:0)
而不是将recyclerview持有人holder.setIsRecyclable
设置为false,而是每次在onBindViewHolder()
方法内设置行背景的颜色。
在Activity中的onClick内,只需更改填充适配器的列表项并调用notifyDataSetChanaged()
答案 1 :(得分:0)
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View row=linearLayoutManager.findViewByPosition(2);
row.setBackgroundColor(getResources().getColor(R.color.blue));
Log.d("onclick", "onClick color changer " );
}
});
这是实现所选颜色的错误方法。您必须在适配器-> onBindViewHolder方法上应用项目更改。
@Override
public void onBindViewHolder(final ViewHolder holder, final int listPosition) {
TextView item = holder.item;
item.setText(itemList.get(listPosition).getName());
holder.setIsRecyclable(false);
if( itemList.get(listPosition).isSelected){
holder.itemview.setBackgroundColor(getResources().getColor(R.color.blue));
}else{
holder.itemview.setBackgroundColor(getResources().getColor(R.color.light));
}
}
并设置方法以选择适配器中的下一项,并确保通知datasetchang方法为被调用。
public void setNextItem(int currentPosition){
for(int i=0;i<itemList.size() ;i++){
if(i == currentPosition) {
itemList.get(i).setSelected = true;
}else{
itemList.get(i).setSelected = false;
}
}
notifyDataSetChanged();
}