在第8个位置,点击次数发生变化时,视图颜色就会发生变化

时间:2020-10-14 15:13:06

标签: java android android-recyclerview

因此,当我单击recyclerview的0位置以更改视图的颜色时,如果我单击位置1,它还将更改第8、16和24位置的颜色(我在recyclerview中共有26个项目)它会在1日,9日,17日和25日更改颜色,依此类推。我该如何解决

我的recyclerview适配器是

public class AdapterOccupiedRoomCleaning extends RecyclerView.Adapter<AdapterOccupiedRoomCleaning.ViewHolder> {
    private List<ItemsAdapter> mList;
    private Context mContext;

    public AdapterOccupiedRoomCleaning(List<ItemsAdapter> list, Context context){
        super();
        mList = list;
        mContext = context;
    }
    @NonNull
    @Override
    public AdapterOccupiedRoomCleaning.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.occupiedrooms_cleaning_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);

        return viewHolder;
    }
    @Override
    public void onBindViewHolder(@NonNull AdapterOccupiedRoomCleaning.ViewHolder viewHolder, int position) {
        ItemsAdapter itemAdapter = mList.get(position);
        ((ViewHolder) viewHolder).setUrduText.setText(itemAdapter.getUrdutext());
        ((ViewHolder) viewHolder).setEnglishText.setText(itemAdapter.getEnglishText());
        ((ViewHolder) viewHolder).setCleaningImage.setImageResource(itemAdapter.getImage());
//        ((ViewHolder) viewHolder).background.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//
//                //viewHolder.background.setBackgroundColor(Color.parseColor("#08A467"));
//                
//                Toast.makeText(mContext, "Recycle Click " + viewHolder.setEnglishText.getText().toString(), Toast.LENGTH_SHORT).show();
//            }
//        });

        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                viewHolder.background.setBackgroundColor(Color.parseColor("#08A467"));
            }
        });
    }

    @Override
    public int getItemCount() {
        //notifyDataSetChanged();
        return mList.size();
    }


    class ViewHolder extends RecyclerView.ViewHolder{
        public TextView setUrduText, setEnglishText;
        public ImageView setCleaningImage;
        public View background;
        public ViewHolder(View itemView) {
            super(itemView);
            setUrduText = (TextView) itemView.findViewById(R.id.urduTextView);
            setEnglishText = (TextView) itemView.findViewById(R.id.englishTextView);
            setCleaningImage = (ImageView) itemView.findViewById(R.id.imageCleaning);
            background = (View) itemView.findViewById(R.id.backgroundColor);
        }
    }
}

我的java类是

public class OccupiedRoomCleaning extends AppCompatActivity {

    String getQrCode, patientMRNO, roomNumber;
    private RecyclerView mRecycleview;
    private List<ItemsAdapter> mList = new ArrayList<>();
    private AdapterOccupiedRoomCleaning mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_occupied_room_cleaning);


        getQrCode = getIntent().getExtras().getString("qrcode");

        init();
        addList();
        adapter();
    }
    private void init(){
        mRecycleview = findViewById(R.id.recyclerview);
    }
    private void addList(){

        ItemsAdapter itemAdapter = new ItemsAdapter();
        itemAdapter.setImage(R.drawable.pillowclean);
        itemAdapter.setUrdutext("sdf");
        itemAdapter.setEnglishText("Pillow Parachute Cover Cleaning");
        mList.add(itemAdapter);

        itemAdapter = new ItemsAdapter();
        itemAdapter.setImage(R.drawable.bedclean);
        itemAdapter.setUrdutext("sdfs");
        itemAdapter.setEnglishText("Patient Bed Cleaning(Blood Spots)");
        mList.add(itemAdapter);

       //... more items




    }
    private void adapter(){
        Log.d("anhtt","mlist : " +mList.size());
        mAdapter = new AdapterOccupiedRoomCleaning(mList, this);
       
        mRecycleview.setAdapter(mAdapter);
        mRecycleview.setLayoutManager(new LinearLayoutManager(this));

    }

}

我在这里做错了什么,它每第8个项目都会更改颜色

2 个答案:

答案 0 :(得分:2)

这似乎与RecyclerView的视图回收行为有关。

通常,只要您有ViewHolder的某些属性,而仅在onBindViewHolder()中有条件设置,就会遇到这样的问题。也就是说,由于您不会始终更新您的ViewHolder的背景颜色,因此在回收和再利用时会得到“错误”的颜色。

您将必须以某种方式将“单击”或“选定”状态存储在项目列表中,然后每次在ViewHolder中更新onBindViewHolder()的背景颜色。像这样:

@Override
public void onBindViewHolder(@NonNull AdapterOccupiedRoomCleaning.ViewHolder viewHolder, int position) {
    ItemsAdapter itemAdapter = mList.get(position);
    ...

    if (itemAdapter.isSelected()) {
        viewHolder.background.setBackgroundColor(Color.parseColor("#08A467"));
    } else {
        viewHolder.background.setBackgroundColor(Color.parseColor("#FFFFFF"));
    }

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemAdapter.setSelected(true);
            viewHolder.background.setBackgroundColor(Color.parseColor("#08A467"));
        }
    });
}

请注意,最好在onCreateViewHolder()内定义单击侦听器,并使用notifyItemChanged()而不是手动更新背景色,但这不在此问题的范围内。

答案 1 :(得分:1)

由于Recycler视图会重用视图并且不创建新视图,因此您需要在onBindViewHolder函数中设置默认颜色。

@Override
public void onBindViewHolder(@NonNull AdapterOccupiedRoomCleaning.ViewHolder viewHolder, int position) {
    ItemsAdapter itemAdapter = mList.get(position);
    ((ViewHolder) viewHolder).setUrduText.setText(itemAdapter.getUrdutext());
    ((ViewHolder) viewHolder).setEnglishText.setText(itemAdapter.getEnglishText());
    ((ViewHolder) viewHolder).setCleaningImage.setImageResource(itemAdapter.getImage());

    // Add this line
    ((ViewHolder) viewHolder).background.setBackgroundColor(Color.parseColor("default color"));

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             viewHolder.background.setBackgroundColor(Color.parseColor("#08A467"));
        }
    });
}