滚动时recyclerview视图行为异常?

时间:2019-11-19 17:47:55

标签: android android-recyclerview

我正在使用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 如何解决此错误。

2 个答案:

答案 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();
    }