ListView,RecyclerView的复用机制,是为了减轻程序运行的压力,但又会由于复用而带来些许错乱问题,这里小编给大家提出一个解决方案,那么先说下解决思路:
1.复用:复用的是Views和datas(数据状态),也就是Holder和XXDataBean;
2.通过在"同个类"中记录的每个view的数据状态,强制改变view的显示状态;
3.当状态被改变时,同步更新"同个类"中临时保存的状态;
那么不再废话,直接上代码,这里以RecyclerView为例:
Adapter类中代码:
public class ReAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements CompoundButton.OnCheckedChangeListener{ private Activity activity; private int TITLE_TYPE = 0; //标题类型 private int CONTENT_TYPE = 1; //内容类型 private String[] titles; private List<Integer> contentListT; private ArrayList<Boolean> contentListCBox; public ReAdapter(Activity activity, RecycleBean bean) { this.contentListT = bean.contentListT; this.titles = bean.titles; this.contentListCBox = bean.contentListCBox; this.activity = activity; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TITLE_TYPE) { View view = activity.getLayoutInflater().inflate(R.layout.adapter_title, new RelativeLayout(activity)); RecycleTitleHolder recycleTitleHolder = new RecycleTitleHolder(view); return recycleTitleHolder; } View view = activity.getLayoutInflater().inflate(R.layout.adapter_content, new RelativeLayout(activity)); RecycleContentHolder recycleContentHolder = new RecycleContentHolder(view); recycleContentHolder.contentCBox.setOnCheckedChangeListener(this); //监听不可重复设置 return recycleContentHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //数据绑定 int itemViewType = getItemViewType(position); if (itemViewType==TITLE_TYPE) { ((RecycleTitleHolder) holder).titleT.setText(titles[position]); }else if (itemViewType==CONTENT_TYPE) { ((RecycleContentHolder) holder).bindData(contentListT,contentListCBox,position); } } @Override public int getItemCount() { return contentListT.size(); } @Override public int getItemViewType(int position) { if (position%9==0) { return TITLE_TYPE; } return CONTENT_TYPE; } @Override public void onCheckedChanged(CompoundButton checkbox, boolean b) { //数据修改 int position = (int) checkbox.getTag(); contentListCBox.set(position, b); //绑定和修改的contentListCBox集合,一定要放在同一个类中,如Adapter或Holder等均可(重点部分) } }
Holder类中代码:
public class RecycleContentHolder extends RecyclerView.ViewHolder { public TextView contentT; public CheckBox contentCBox; public RecycleContentHolder(View contentView) { super(contentView); contentT = (TextView) contentView.findViewById(R.id.content_tv); contentCBox = (CheckBox) contentView.findViewById(R.id.checkbox_content); } public void bindData(List<Integer> contentListT, ArrayList<Boolean> contentListCBox, int position) { contentT.setText(String.valueOf(contentListT.get(position))); contentCBox.setTag(position);//要先设置position给contentCBox,然后再setChecked();此处顺序不能颠倒(重点) contentCBox.setChecked(contentListCBox.get(position)); } }
Activity中部分代码:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(OrientationHelper.VERTICAL); //布局方向 // recyclerview.addItemDecoration( new item); //分割线 // recyclerview.setItemAnimator(); //添加动画 ReAdapter reAdapter = new ReAdapter(this,bean); recyclerview.setLayoutManager(linearLayoutManager); recyclerview.setHasFixedSize(true); //保存item尺寸值,以便不在测量 recyclerview.setAdapter(reAdapter);
其他此类文章: http://www.wfuyu.com/technology/23153.html
Android RecyclerView 使用完全解析: 猛戳_网址大大
SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和下拉刷新: 猛戳_网址呱呱