我了解到,为了最大限度地提高 Android 列表视图的效率,您应该只拥有适合屏幕大小的膨胀“行”视图。一旦视图移出屏幕,您应该在您的视图中重复使用它getView
方法,检查是否convertView
是否为空。
但是,当您需要两种不同的列表布局时,如何实现这个想法呢?假设它是订单列表,其中一个布局用于已完成的订单,另一个布局用于处理中的订单。
这是我的代码正在使用的想法的示例教程。就我而言,我有 2 行布局:R.layout.listview_item_product_complete
and R.layout.listview_item_product_inprocess
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
if(getItemViewType(position) == COMPLETE_TYPE_INDEX) {
convertView = mInflator.inflate(R.layout.listview_item_product_complete, null);
holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_complete);
holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_complete);
}
else { // must be INPROCESS_TYPE_INDEX
convertView = mInflator.inflate(R.layout.listview_item_product_inprocess, null);
holder.mNameTextView = (TextView) convertView.findViewById(R.list.text_inprocess);
holder.mImgImageView = (ImageView) convertView.findViewById(R.list.img_inprocess);
}
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
thisOrder = (Order) myOrders.getOrderList().get(position);
// If using different views for each type, use an if statement to test for type, like above
holder.mNameTextView.setText(thisOrder.getNameValue());
holder.mImgImageView.setImageResource(thisOrder.getIconValue());
return convertView;
}
public static class ViewHolder {
public TextView mNameTextView;
public ImageView mImgImageView;
}
您需要让适配器的视图回收器知道有多个布局以及如何区分每一行的这两种布局。只需重写这些方法:
@Override
public int getItemViewType(int position) {
// Define a way to determine which layout to use, here it's just evens and odds.
return position % 2;
}
@Override
public int getViewTypeCount() {
return 2; // Count of different layouts
}
包含getItemViewType()
inside getView()
, 像这样:
if (convertView == null) {
// You can move this line into your constructor, the inflater service won't change.
mInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
if(getItemViewType(position) == 0)
convertView = mInflater.inflate(R.layout.listview_item_product_complete, parent, false);
else
convertView = mInflater.inflate(R.layout.listview_item_product_inprocess, parent, false);
// etc, etc...
观看 Android 的 Romain Guy讨论视图回收器 http://www.youtube.com/watch?v=N6YdwzAvwOA在谷歌演讲中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)