看图:



视觉效果、recyclerview的基本用法都不说了,超级简单,稍后看代码。

重点来说说item状态的保存问题,其实这个也不是什么新鲜问题,处理起来也不难,方法众多,有setTag的,也有保存到map的。接下来我展示一种自认为更优的方式。

先描述问题,如上图,我们选中了第三个item。然后滑动RecyclerView,让第三个item移出界面后,在滑回来,item的状态是否还在?

由于滑动,view的复用,会丢失之前item选中的状态,但是,但是,item上显示的数据为什么没有错乱呢?这是因为数据集合没有错乱。那么我们能不能把item上需要保存的状态,也与数据集合一同保存呢?这样是不是就不会错乱。当然可以,这样更容易理解。

在数据集合中需要预留本地字段来保存状态。

适配器中的部分代码:

public class MyAdapter extends RecyclerView.Adapter {    //...    private ArrayList mLists = new ArrayList<>();    //...}

故,UserBean中添加字段:

public class UserBean {    //后台返回的json字段    public String userName;    public String userPwd;    //...    //本地字段,用户recyclerview保存状态    public boolean isSelected = false;}

在适配器中操作的核心部分代码:

/** * @DateTime: 2016-07-26 14:31 * @Author: duke * @Deacription: */public class MyAdapter extends RecyclerView.Adapter {    //...    private ArrayList mLists = new ArrayList<>();    //记录上次的位置和容器    private LinearLayout oldContainer;    private int oldPosition;    @Override    public void onBindViewHolder(VH holder, final int position) {        //强制关闭复用        //holder.setIsRecyclable(false);        final UserBean user = this.mLists.get(position);        holder.word.setText(user.userName);        if (user.isSelected) {            //选中的样式            holder.container.setBackgroundResource(R.drawable.item_bg_press);        } else {            //未选中的样式            holder.container.setBackgroundResource(R.drawable.item_bg);        }        holder.container.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if (listener != null)                    listener.onDKClick(view, mLists.get(position), position);                //复原old位置                if (oldContainer != null) {                    oldContainer.setBackgroundResource(R.drawable.item_bg);                    if (oldPosition >= 0 && oldPosition < MyAdapter.this.mLists.size())                        MyAdapter.this.mLists.get(oldPosition).isSelected = false;                }                //设置新的位置样式                oldContainer = (LinearLayout) view;                oldPosition = position;                oldContainer.setBackgroundResource(R.drawable.item_bg_press);                MyAdapter.this.mLists.get(oldPosition).isSelected = true;            }        });    }    //...}

1、当对当前item做点击等事件操作时,需要把当前状态值保存到对应集合的对象中去。

2、复位上一个被点击的item状态。

3、当再次展示该item赋值时,根据集合中对应对象的数据来初始化item状态。


就是这么简单,直观易懂。listview、gridview等雷同的问题都可以这么解决。


http://download.csdn.net/detail/fesdgasdgasdg/9883490

更多相关文章

  1. 对Android中XML解析的小结
  2. 丢掉龟速的java媒体库,通过Lame实现Android录音同时转换为mp3格式
  3. Android(安卓)webview 设置cookie 保持登录状态
  4. 结合Android学设计模式--开篇
  5. Android学习笔记(第一篇)编写第一个程序Hello World+Activity
  6. [Android(安卓)Training视频系列] 6.3 Saving Data in SQL Datab
  7. 巧用android 控件—CheckBox + 状态选择器
  8. Android和用户交互的媒介Activity-生命周期方法
  9. Android之判断设备网络连接状态,并判断连接方式

随机推荐

  1. Python3 基本数据类型
  2. 【python 编程】网页中文过滤分词及词频
  3. 【好文收藏】理解python多线程
  4. python 发送带附件的邮件
  5. Python 安装 pip模块
  6. python opencv入门 轮廓的层次结构(21)
  7. python函数不定长参数
  8. Python MOOC简单获取网页内容并以html格
  9. day05 python程序中的注释
  10. python基础练习--求1+2!+3!+...+20!的和