android listview多个视图

时间:2012-03-14 19:02:18

标签: android listview

我有一个包含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中的随机位置多次结束。

1 个答案:

答案 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
}