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

Second type item appears when scrolling in android, different items listview example

我想为 7th, 14th, 21th 个职位添加新的 imageview 项目。

当我添加新项目并为其创建新布局类型时,效果不佳。

当滚动大量 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;        
    }
}

我认为您遇到问题的原因是您没有意识到 ListView 正在回收它的视图。根据视图是否位于位置 7,您似乎正在使用 2 个不同的视图持有者 - 因此您实际上是在使用 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)

这将检查 position 是否是 7 的倍数 - 涵盖您提到的所有情况。