关闭

Android ListView和RecyclerView常见问题

标签: androidlistview
929人阅读 评论(0) 收藏 举报
分类:

前言:ListView和RecyclerView基本用法很简单,即三要素:控件(界面),数据源,适配器。但基本控件无法满足需求只能定制时,遇到一些问题,总结一下。

  • 性能优化
  • 滑动时数据加载混乱
  • nofityDataSetChanged不起作用

性能优化

性能优化,大多是在getView()方法中采用内部类ViewHolder,保存已经加载过的布局convertView和控件实例如TextView、ImageView等。滑动时会实时加载getView(),其中获得布局和控件实例的inflate和findViewById方法比较耗时,如果有现成的convertView和TextView、ImageView等可以复用,会提高运行效率,在快速滑动时表现出更好的性能。

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        SensorItemInfo sensorItemInfo = (SensorItemInfo)getItem(position);
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.sensor_task_info_item, null);
            holder.sensortype = (TextView) convertView.findViewById(R.id.sensortype);
            holder.average_value = (TextView) convertView.findViewById(R.id.average_value);
            holder.day_thre = (TextView) convertView.findViewById(R.id.day_threshold);
            holder.night_thre = (TextView) convertView.findViewById(R.id.night_threshold);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag(); //复用convertView
        }

        int sensorType = sensorItemInfo.getSensorType();
        String unit = UIDisplay.showSensInforListUnit(sensorType); //根据类型获取单位
        holder.sensortype.setText("类型:" + UIDisplay.showSensInfoListSensType(sensorItemInfo.getSensorType())); //根据int值获取传感器类型
        holder.average_value.setText("平均值:" + UIDisplay.showSensInfoListValue(sensorType, sensorItemInfo.getAverageValue()) + unit);
        holder.day_thre.setText("白天门限:" +  UIDisplay.showSensInfoListValue(sensorType, sensorItemInfo.getAverageValue()) + unit);
        holder.night_thre.setText("夜间门限:" +  UIDisplay.showSensInfoListValue(sensorType, sensorItemInfo.getAverageValue()) + unit);

        return convertView;
    }

滑动时数据加载错乱

数据加载混乱有很多解决方法,目前学习的,是通过setTag()解决。通过setTag(),关联view和控件,控件和数据,这里的itemInfo,可以是check状态,也可以是ImageView的url。

  • convertView.setTag(viewHolder)
  • viewHolder.***.setTag(itemInfo)

我遇到的问题是,全部设置成联动模式时,左右滑动,不同设备上绑定的传感器个数和种类就会诡异地变来变去。数据不是简单状态值或是某张图片的url,是一个保存了传感器类型和数值的List<\E>。setTag()的方法我没有尝试,目前的解决方法是在横向滑动的RecyclerView中,选择 viewHolder.setIsRecyclable(false);禁止复用。


notifyDataSetChanged不起作用

adapter.notifyDatasetChanged()不起作用,参考资料[1]中作者总结了三种原因,关键问题都出在数据源。数据的更新和引用必须是同一个,数据源更新也需要通知adapter。


横向RecyclerView和竖向ListView的混合展示

RecyclerView禁止复用,ListView进行优化,滑动时没有卡顿,但是根据传感器实时值自动刷新界面功能还没有实现。

这里写图片描述


参考资料

[1]. ListView和GridView调用nofityDataSetChanged界面不刷新
[2]. ListView优化机制及滑动数据时出现的数据混乱错误问题

1
0
查看评论

ViewHolder重用机制 RecyclerView+CardView 优化

ListView的优化想必大家耳熟能详,其中必有ViewHolder的重用机制,holder的写法就是为了将一些你所需要展现在view上的元素封装好。 主要起作用的是convertView.setTag()方法,传入holder,将数据缓存起来,下次使用的时候可避免回收。当然,在数据量小的时候体现不...
  • u013000304
  • u013000304
  • 2016-05-21 17:11
  • 2028

【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制

秉承着实事求是的作风,弄清楚RecyclerView是否有足够的吸引力替换掉ListView,我从性能这一角度出发,研究RecyclerView和ListView二者的缓存机制,并得到了一些较有益的"结论",待我慢慢道来。 同时也希望能通过本文,让大家快速了解RecyclerVi...
  • Tencent_Bugly
  • Tencent_Bugly
  • 2016-10-31 11:48
  • 4497

ListView与RecyclerView的区别

android 5.0推出了recyclerView,号称更快的listview,那他们究竟有什么本质上的不同呢?现在来好好探究下。RecycleBin vs Recycler这两个类是重用view的核心类,其负责回收多余的view并对新的view进行重用,实际都是使用arrayList,不同之处是...
  • u014497502
  • u014497502
  • 2016-03-17 21:30
  • 3510

RecyclerView与ListView对比浅析(二):View缓存篇

上一篇链接:RecyclerView与ListView对比浅析(一):初始化篇 (二)View缓存篇 1. AbsListView(源码版本4.4) RecyclerBin是AbsListView中专门处理View缓存的类,官方注释中说明其存有两组View——ActiveViews和Scr...
  • checkin001
  • checkin001
  • 2015-11-29 17:39
  • 6825

RecyclerView 和 ListView的区别

> Android 优雅的为RecyclerView添加HeaderView和FooterView--http://blog.csdn.net/lmj623565791/article/details/51854533 > RecyclerView 和 ListView 在 Androi...
  • ShareUs
  • ShareUs
  • 2016-08-08 21:48
  • 5847

RecyclerView 和 ListView 性能和效果区别

RecyclerView 和 ListView 布局效果的对比RecyclerView 和 ListView 一些常用的功能 和 API 的对比RecyclerView 和 ListView 在 Android L 引入嵌套滚动机制之后的对比 有一点需要强调下,文中所有的效果在真机上都是很流畅...
  • fanenqian
  • fanenqian
  • 2017-03-10 09:31
  • 483

ListView和RecyclerView的使用和性能优化总结

在手机中,使用列表显示是一种常见的显示格式,那么ListView就是一种常见的方式。例如:今日头条,网易新闻都是使用ListView或者是最近流行的RecyclerView进行首页的布局。
  • xz10561
  • xz10561
  • 2015-02-25 12:38
  • 2770

Android RecyclerView 实现ListView GridView混排

1、Adapter中定义不同Item类型,复写getItemViewType方法 2、在onCreateViewHolder中根据viewType返回不同的ViewHolder 3、onBindViewHolder根据不同ViewHolder渲染内容 4、Activity中定义GridLayo...
  • u010259369
  • u010259369
  • 2016-10-19 14:15
  • 1250

RecyclerView 与ListView、GridView的区别

文章部分代码参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2004.html RecyclerView Adapter相对于ListView Adapter: 1、它将数据、排列方式、数据的展示方式都分割开...
  • ajiaojie
  • ajiaojie
  • 2016-11-23 15:25
  • 669

Android ListView 与 RecyclerView 对比浅析--缓存机制

一,背景 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大和灵活。 最近,自己负责的业务,也遇到这样的一个问题,关于是否要将ListView替换为RecyclerView? 秉承着实事求是的作风,弄清楚Recycler...
  • zxdong_
  • zxdong_
  • 2016-12-07 15:19
  • 474
    个人资料
    • 访问:47152次
    • 积分:957
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:0篇
    • 译文:4篇
    • 评论:12条
    最新评论