ListView的重用

1. 使用ListView在两种单元格模式下的重用,效果见下图

其中黑色的横杠是一种单元格模式,其他的是一种单元格模式,这两种格式的单元格交替出现并重用,不做一定的判断就会在重用的时候出现混乱。其中黑条单元格是纯文本,其他的是RelativeLayout布局。

public View getView(int position, View convertView, ViewGroup parent) {
            Log.e("John", "ProcessAdapter" + " # " + "position = " + position);
            // 设置两个标记就是系统和个人的分界,这里一开始是直接判断是否是标题然后直接返回的是纯文本格式的
            if (position == 0) {
                Log.e("John", "ProcessAdapter" + " # " + "返回 用户进程");
                TextView tv1 = new TextView(parent.getContext());
                tv1.setText("用户进程");
                return tv1;
            }
            if (position == (userProcess.size() + 1)) {
                Log.e("John", "ProcessAdapter" + " # " + "返回 系统进程");
                TextView tv2 = new TextView(parent.getContext());
                tv2.setText("系统进程");
                return tv2;
            }          // 获取数据
            ProcessInfo pi;
            if (position < userProcess.size() + 1) {
                pi = userProcess.get(position - 1);
            } else {
                pi = sysProcess.get(position - userProcess.size() - 1 - 1);
            }      // 关键这里自定义一个view用来,这个view区别于convertview,因为现在有了不同的形式的单元格view所以在传入进来的convertview可能会是两种格式的。      // 就不像之前在convertview只有一种格式的时候我们只用了convertview来判断他是否是空,并且直接用convertview来进行填充视图,这里就用另一个view来填充视图,而convertview就只      // 当做一个被传入的复用的视图来进行判断,当conviertview符合条件的时候我们就让这个view去使用convertview,但是如果convertview是空那么就view去进行填充。
            View view;
            ViewHolder vh;
            // 复用的规则
            if (convertView != null && convertView instanceof RelativeLayout) {
                // 这里这个view获得重用的convertview,因为这个convertview符合下面要使用的view的条件
                view = convertView; // 获取重用的view
                vh = (ViewHolder) view.getTag();
            } else {
                Log.e("John", "ProcessAdapter" + " # " + "创建新的convertview");
                vh = new ViewHolder();
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_process_manage, null);
                vh.ivIcon = (ImageView) view.findViewById(R.id.iv_icon_process_manage);
                vh.tvName = (TextView) view.findViewById(R.id.tv_name_process_manage);
                vh.tvSize = (TextView) view.findViewById(R.id.tv_size_process_manage);
                vh.ckChecked = (CheckBox) view.findViewById(R.id.ck_item_process_manage);
                view.setTag(vh);
            }

            vh.ivIcon.setImageDrawable(pi.getIcon());
            vh.tvName.setText(pi.getName());
            String sizeStr = Formatter.formatFileSize(parent.getContext(), pi.getSize());
            vh.tvSize.setText(sizeStr);
            vh.ckChecked.setChecked(pi.isChecked());

            return view;
        }
时间: 2024-10-07 00:58:06

ListView的重用的相关文章

Android从源代码看ListView的重用机制

无论是android还是iOS,列表视图应该是最复杂的控件了,android中的listview从命名可以看出是个一维数组,而iOS中的tableview则是二维数组,但其实需要注意的地方是差不多的,都是重用机制,这是考量你对listview能否掌握的最好的方法. 常见的listview的初始化以及设置适配器的代码如下: ListView listView; MyAdapter listAdapter; ArrayList<String> listString; listView = (Lis

Android从源码看ListView的重用机制

不管是android还是iOS,列表视图应该是最复杂的控件了.android中的listview从命名能够看出是个一维数组,而iOS中的tableview则是二维数组.但事实上须要注意的地方是差点儿相同的.都是重用机制.这是考量你对listview是否能掌握的最好的方法. 常见的listview的初始化以及设置适配器的代码例如以下: ListView listView; MyAdapter listAdapter; ArrayList<String> listString; listView

android listview 重用view导致的选择混乱问题

20150526 listview是常用的控件,经常用自定义的adapter,为了提高显示效率,常利用view的重用方式防止重绘,但因为重用利用的是旧的view,常导致显示的数据会由于position的位置出现错乱.在一个app项目中我遇到过多次这个问题,包括带Button的都能很好的解决,但今天遇到listview中的item有togglelbutton的情况,绑定的监听器是togglebutton的CompoundButton.OnCheckedChangeListener(),竟然出现了问

android listview 异步加载问题

============问题描述============ 学做android,自己想模仿QQ空间做一个小demo listview异步加载图片的时候遇到了一个问题 异步加载用到了SoftReference 和文件缓存的方法 每次加载图片的时候,也在内存或缓存中找到了图片 第一次加载出来后,listview滑动了,同样也进到了setImageBitmap这一步 可是就是图片显示不出来变成空白 下面帖几张图和代码 滑动前 滑动后 Image_url = new StringBuffer(AppCon

智慧city

# 智慧北京黑马74期笔记 # # 智慧北京黑马74期笔记 # ## 项目角色 ## - 产品经理(产品狗,产品汪) 决定开发什么东西, 需求文档(原型图) - 程序员(码农, 程序猿, 攻城狮) 负责开发 - Android开发工程师 - IOS开发工程师 - 服务器开发工程师JavaEE/PHP/.Net (接口文档) - 视觉设计师/UI设计师(美工) 效果图, 切图 1280*720分辨率(主流分辨率) - 测试工程师 - 运营(销售, 推广, 打广告, 写软文) ## 开发流程 ##

续说ListView重用之加载图片

最近领养了一直小狗狗,据狗主人说是只阿拉斯加,求大伙见证. 不管他是不是阿拉斯加,我还是得养着,取名"蛋蛋". 继续谈技术. 说到listview里加载图片永远是个说不完的话题. 在listview中如果每个item都有图片需要下载的话,我们就得考虑由于大量图片加载而导致的oom(out of memory)问题. 一个典型的做法是,下载图片的时候看看缓存中有没有该图片,如果缓存中没有,就从sd卡中读取,如果sd卡中还没有,再去服务器下载,下载下来的图片先放在sd卡中,并放到缓存中.如

ListView显示不同行以及数据重用

Handling ListViews with Multiple Row Types When you start writing Android Apps it isn’t long before you need to use ListViews. ListViews are easy to get started with, but it’s also very easy to write inefficient lists that wreak havoc on scrolling pe

Android性能优化之Listview(ViewHolder重用机制)

相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了. ListView优化主要有下面几个方面: 1.convertView重用 2.ViewHolder的子View复用 3.缓存数据复用 一.convertView重用 首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView()的方法,这个方法会传入一个convert

Android ListView复杂列表优化实践

原文:Android ListView复杂列表优化实践 很多社交App都不免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了不少的挑战.本文就是在实现复杂的列表滑动的情况下,利用已知的优化方法指导下的一次优化实践,旨在提升ListView的滑动流畅度,为用户带来良好的体验. 1:设计稿: 这是列表中可能出现的ItemView,有两种,但是又有许多相同的地方,比如一样有点赞的图片,评论等...其中,评论和点赞的数量是可变的. 2:使用一般布局带来的问