浅谈Android为RecyclerView增加监听以及数据混乱的小坑
为RecyclerView增加监听
1、在实现好的MyAdapter中写内部接口:
publicvoidsetOnItemLongClickListener(OnItemLongClickListeneronItemLongClickListener){ this.onItemLongClickListener=onItemLongClickListener; } publicvoidsetOnItemClickListener(OnItemClickListeneronItemClickListener){ this.onItemClickListener=onItemClickListener; } publicinterfaceOnItemClickListener{ voidonItemClick(Viewview,intpos); } publicinterfaceOnItemLongClickListener{ voidonItemLongClick(Viewview,intposition); }
2、继续在MyAdapter中增加以下代码:
publicclassMyAdapterextendsRecyclerView.Adapter{ privateOnItemClickListeneronItemClickListener; privateOnItemLongClickListeneronItemLongClickListener; ...... @Override publicvoidonBindViewHolder(ViewHolderholder,intposition){ finalintpos=holder.getLayoutPosition(); holder.mTextView.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewview){ if(onItemClickListener!=null) onItemClickListener.onItemClick(view,pos); } }); holder.mTextView.setOnLongClickListener(newView.OnLongClickListener(){ @Override publicbooleanonLongClick(Viewview){ if(onItemLongClickListener!=null){ onItemLongClickListener.onItemLongClick(view,pos); } returntrue; } }); } }
以上代码是接口一般的写法,没什么难度,需要注意的是几个局部刷新的方法。
3、为了将性能提升至极致,RecyclerView的视图中某个item数据变化时,RecyclerView.Adapter提供几个局部刷新数据视图的方法:
//该方法用于当增加一个数据的时候,position表示新增数据显示的位置 finalvoidnotifyItemInserted(intposition) //该方法用于删除一个数据的时候,position表示数据删除的位置 finalvoidnotifyItemRemoved(intposition) //该方法表示所在position对应的item位置不会改变,但是该item内容发生变化 finalvoidnotifyItemChanged(intposition) //当然也还有老方法全部刷新,该方法一般用于:适配器之前装载的数据大部分已经过时了,需要重新更新数据调用 //该方法的时候,recyclerView会重新计算子item及所有子item重新布局,简单但是效率低并且不带默认的动画: finalvoidnotifyDataSetChanged()
出于效率考虑,官方建议用更加精确的方法(比如上面三个方法)来取代这个方法:
①.在RecyclerView.ViewHolder中说提及position(下标)时,有两种情况:
i.由ViewHolder的getLayoutPosition()方法返回的,是视图中itemView的下标
i.由ViewHolder的getAdapterPosition()方法返回的,是Adapter数据集(如ArrayList)data元素的下标.
正常时,第几个itemView上显示地接个data的内容,两者一一对应。
②.但是在使用局部刷新的几个方法时要注意,我们知道,一个数据集比如ArrayList,移除某个元素时,它后面的元素会向前填充,所以后面每个元素的下标都会减一;
③.然而对于getLayoutPosition()来讲,当我们用notifyItemInserted方法移除掉一个itemView时,视图上看后面的itemView会挤上去,但是它们的下标是没有变的。比如十个itemView(下标0到9)我用notifyItemInserted方法移除了第三个,那么视图中剩下的itemView的下标就是(0,1和3到9),这时候再去对数据集调用remove(9)的话势必会抛出数组越界异常;
④.因此在每次刷新后,要使用notifyItemRangeChanged(intpositionStart,intitemCount)调整itemView的下标,使其和数据集的下标始终是一一对应。其中positionStart是第一个改变的itemView下标,itemCount指它后面下标也需要改变的itemView个数
以上是RecyclerView的初级具体使用方法。
这篇浅谈Android为RecyclerView增加监听以及数据混乱的小坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。