在Android中滚动时出现第二种类型的项目,不同项目列表视图示例

问题描述:

我想为7th, 14th, 21th位置添加新的imageview项目。在Android中滚动时出现第二种类型的项目,不同项目列表视图示例

当我添加新项目并为其创建新的布局类型时,它不能很好地工作。

当滚动批次imageview(类型2)项目出现在不同的位置。

我该如何解决这个问题,是我的错误?

(我只是尝试了第七的位置在这个代码来解决问题的滚动)

public class MyAdapter extends BaseAdapter{ 

    MyFragmentManager mFragmentManager; 
    List<Tier3Category>list; 
    Context context;  
    ListView myList; 
    OneriDetail myObj; 
    Tier3Category obj; 


    public MyAdapter(Context context, List<Tier3Category> list, MyFragmentManager mFragmentManager, 
      ListView myList, int type) { 
     super(); 
     this.mFragmentManager = mFragmentManager; 
     this.list = list; 
    if(list.size()>1) 
     list.add(7,new Tier3Category("", "", "", "", "", "", "", "", "", "", "", "", "", false, false, false, "", "", "", "")); 
     Log.w("", list.size()+"asd"); 
     this.context = context; 
     this.myList = myList; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return list.size(); 
    } 

    @Override 
    public Tier3Category getItem(int position) { 
     if (getCount()>0){ 
      return list.get(position); 
     } 
     else{ 
      return null; 
     } 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     final ViewHolder1 vh ; 
     final ViewHolder2 vh2; 


     if(position!=7){   
     try { 
      if (convertView==null){   
       vh = new ViewHolder1(); 

        convertView = LayoutInflater.from(context).inflate(
          R.layout.adapter_oneri_list, parent, false); 
        vh.title = (TextView) convertView.findViewById(R.id.list_title);    
        convertView.setTag(vh); 
      }          
      else{ 
       vh = (ViewHolder1)convertView.getTag(); 
       } 
      convertView.setTag(vh); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      }   
     } 

     else { 
      try { 
       if (convertView==null){  
       vh2 = new ViewHolder2(); 
        convertView = LayoutInflater.from(context).inflate(R.layout.adapter_adv_item, parent,false); 
        vh2.adv_photo = (ImageView) convertView.findViewById(R.id.adv_image); 
        convertView.setTag(vh2);  

       }          
        else{ 
         vh2 = (ViewHolder2)convertView.getTag(); 
         } 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }    
     } 

     return convertView; 
    } 
    public class ViewHolder1{ 
     TextView comment_count , like_count , follow_count , username , time , title , content, location , categoryname; 
     RoundedImageView sugg_photo; 
     RoundedImageView user_photo; 
     RelativeLayout threedot; 
     ImageView likeIcon , commentIcon , followIcon; 
    } 

    public class ViewHolder2{ 
     ImageView adv_photo;   
    } 
} 

enter image description hereenter image description here

我相信您有任何问题的原因是,你有没有意识到ListView正在回收它的意见。看起来你正在使用2个不同的视图,取决于视图是否在位置7 - 因此你基本上使用了2种不同类型的视图。问题在于ListView不知道这一点,所以你在5号位置创建的视图可能会在滚动后结束于7号位置。这是作为convertView参数传入的。

我敢打赌,你会得到很多在LogCat中打印的堆栈跟踪 - 一个非常重要的细节。

围绕它最简单的方法是检查你得到什么样的观点为convertView:

 if(position!=7){   
    try { 
     if (convertView==null || convertView.getTag() ! instanceof ViewHolder1){  

else { 
     try { 
      if (convertView==null || convertView.getTag() ! instanceof ViewHolder2){  

我建议你做的另一件事是停止检查位置7,而是做:

if (position % 7 != 0) 

这将检查位置是否是7 - 涵盖你提到的所有案例。

+0

非常感谢您,YOU ROCK。这工作:) –