我有一个包含2个视图的列表视图,一个用于第一行,另一个用于其余视图。
这是我在getView中的代码:
ViewHolder holder = null;
// if (convertView == null)
// {
holder = new ViewHolder();
if(position==0 && category.equalsIgnoreCase("normal"))
{
convertView = mInflater.inflate(R.layout.item_featured_list_row, null);
}
else
{
convertView = mInflater.inflate(R.layout.item_list_row, null);
}
holder.imgItem = (ImageView) convertView.findViewById(R.id.itemImage);
//holder.imgArrow = (ImageView) convertView.findViewById(R.id.arrowImage);
holder.txtItem = (TextView) convertView.findViewById(R.id.itemText);
holder.itemValueLabel = (TextView) convertView.findViewById(R.id.itemValueLabel);
holder.itemPrice = (TextView) convertView.findViewById(R.id.itemPrice);
convertView.setTag(holder);
// }
// else
// holder = (ViewHolder) convertView.getTag();
问题是,如果我将其取消注释,它只会以这种方式工作,但我觉得有充分的理由检查convertView是否为null并且不会重新膨胀已经膨胀的东西。但如果我取消注释它,它只适用于第一次加载。一旦我通过更新数组并调用notifydatasetchanged来刷新列表,第一行项就会在listview中的随机位置多次结束。
答案 0 :(得分:0)
如果您使用不同的布局,则需要检查是否可以重用convertView
。您可以向持有者添加类型指示器,并检查convertView的类型是否可以修改。如果没有给新视图充气。
// check type - use int if you need more than just two layouts.
boolean requiredViewType = (position == 0 && category.equalsIgnoreCase("normal"));
if (convertView == null || convertView.getTag().viewType != requiredViewType) {
holder = new ViewHolder();
if (position == 0 && category.equalsIgnoreCase("normal")) {
convertView = mInflater.inflate(R.layout.item_featured_list_row, null);
} else {
convertView = mInflater.inflate(R.layout.item_list_row, null);
}
holder.imgItem = (ImageView) convertView.findViewById(R.id.itemImage);
// holder.imgArrow = (ImageView)
// convertView.findViewById(R.id.arrowImage);
holder.txtItem = (TextView) convertView.findViewById(R.id.itemText);
holder.itemValueLabel = (TextView) convertView.findViewById(R.id.itemValueLabel);
holder.itemPrice = (TextView) convertView.findViewById(R.id.itemPrice);
// set the type - you obviously need to add that field to ViewHolder
holder.viewType = requiredViewType;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
// etc
}