您的位置:首页 > 移动开发 > Android开发

Android RecycleView 实现单选列表 并解决View复用导致错乱问题

2017-03-25 14:27 561 查看

1.缓存机制






离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取


因此实现单选的过程中会出现多选的情况或内容错乱,原因是取得是之前的缓存的item布局。

2.解决办法

使用
if else
做不同处理

不同类型item 重写 
getItemViewType()


@Override
public int getItemViewType(int position){

return mDatas.get(position).isTitle();
}

//填充onCreateViewHolder方法返回的holder中的控件
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {

switch (getItemViewType(position)){
case 0:
holder.tv.setText( mDatas.get(position).getWork());
if(mDatas.get(position).isSelected()) {
holder.layout.setBackgroundColor(mContext.getResources().getColor(R.color.standard));
}
else {
holder.layout.setBackgroundColor(mContext.getResources().getColor(R.color.white));

}
holder.layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//实现单选方法二: notifyItemChanged() 定向刷新两个视图
//如果勾选的不是已经勾选状态的Item
if (mSelectedPos!=position){
//先取消上个item的勾选状态
if(mSelectedPos!=-1) {
mDatas.get(mSelectedPos).setSelected(false);
notifyItemChanged(mSelectedPos);
}
//设置新Item的勾选状态
mSelectedPos = position;
mDatas.get(mSelectedPos).setSelected(true);
notifyItemChanged(mSelectedPos);
}
}
});
break;
case 1:
holder.tv.setText( mDatas.get(position).getWork());
break;

}

}

//重写onCreateViewHolder方法,返回一个自定义的ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder holder=null;
View view=null;
switch(viewType){
case 0:
view = inflater.inflate(R.layout.item_selectwork_list,parent, false);
holder= new MyViewHolder(view);
break;
case 1:
view = inflater.inflate(R.layout.item_selectwork_list2,parent, false);
holder= new MyViewHolder(view);
break;
}

return holder;
}

3.DEMO下载

demo1
demo2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐