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