2012-03-14 3 views
0

У меня есть listview с 2 видами, один для первой строки, а другой для остальных.android listview несколько просмотров

Вот мой код в 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 является недействительным и не раздувать что-то уже раздутое. Но если я раскомментирую его, он работает только при первом загрузке. Как только я обновляю список, обновляя массив и вызывая notifydatasetchanged, первые элементы строки заканчиваются несколько раз в случайных местах в моем списке.

ответ

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 
} 
Смежные вопросы