问题是像列表视图一样的recyclelerView有多少子视图(项目)取决于你的屏幕大小,而不是你有多少项目.它会阻止应用程序出现OOM异常.例如,如果您有1M项,那么,从您的逻辑来看,Recycler视图必须创建1M子视图,这很糟糕.您可以在此处阅读有关列表视图的更多信息(回收站视图以相同方式工作)
因此,在您的情况下,onClick
您不需要查找视图并进行更改.您需要更改一些所谓的"设置"并写入notifyDataSetChanged
或notifyItemChanged
更多优化.
我也检查了你的代码,我求你了.请,请删除此覆盖功能:
@Override public int getItemViewType(int position) { return position; }
您对所有项目使用相同的持有者,因此您的回收站视图中只有一种类型的视图.以您告知回收站视图的方式覆盖此方法,每个项目使用不同的布局,这会降低性能.
所以,根据你的问题,你将有某种形式:
reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.e("Item Pos", "" + position); Log.e("Item Rv", "" + reView.getChildCount()); Log.e("Child Adapter", "" + reView.getAdapter().getItemCount()); if (!adapter.isChecked(position)) { adapter.setChecked(position); } } @Override public void onLongItemClick(View view, int position) { } }));
在适配器中:
private int checkedPosition = -1; @Override public void onBindViewHolder(ViewHolder holder, int position) { RvModel rvModel = rvModels.get(position); holder.txtText.setText(rvModel.getTitle()); if (position == checkedPosition) { txtText.setBackgroundColor(Color.BLUE); txtText.setTextColor(Color.WHITE); } else { txtText.setBackgroundColor(Color.WHITE); txtText.setTextColor(Color.BLUE); } } public boolean isChecked(int position) { return checkedPosition == position; } public void setChecked(int position) { int prevChecked = checkedPosition; checkedPosition = position; if (prevChecked != -1) { notifyItemChanged(prevChecked); } notifyItemChanged(checkedPosition) }