在Android Listview中重复使用2种不同布局的视图

我了解到,为了最大限度地提高Android列表视图的效率,您应该只有尽可能多的“行”视图,以适应屏幕上的需要。 一旦视图移出屏幕,您应该在您的getView方法中重用它,检查convertView是否为null。

但是,如果你需要2种不同的布局来实现这个想法,你怎么能实现这个想法呢? 可以说它是一个订单列表,1布局是完成的订单,另一个布局是在处理订单。

这是我的代码正在使用的想法的示例教程。 在我的情况下,我会有2行布局: R.layout.listview_item_product_completeR.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 } 

getView()中包含getItemViewType() ,如下所示:

 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在Google Talks 讨论视图回收站 。

无需自己devise解决scheme,只需重写getItemViewType()和getViewTypeCount()即可。

请参阅以下博客文章http://sparetimedev.blogspot.co.uk/2012/10/recycling-of-views-with-heterogeneous.html

正如博客解释,Android实际上并不保证 getView将接收正确的types的视图。