ListView的重用

Posted 乌拉小考

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }

 

以上是关于ListView的重用的主要内容,如果未能解决你的问题,请参考以下文章

片段中ListView的setOnItemClickListener

Android从源码看ListView的重用机制

片段中的ListView不显示

如何从片段到活动而不会干扰片段的可重用性

在片段中添加 ListView

ListView 未显示在片段中