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

时间:2015-07-13 08:20:35

标签: android listview scroll position items

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

当我添加新项目并为其创建新的布局类型时,它无效。

当滚动大量imageview(type2)项目出现在不同位置时。

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

(我在此代码中只尝试了第七个位置来解决滚动问题。)

    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 here enter image description here

1 个答案:

答案 0 :(得分:1)

我相信您遇到问题的原因是您还没有意识到ListView正在回收它的观点。根据视图是否位于第7位,您似乎使用了2个不同的视图 - 因此您实际上使用的是2种不同类型的视图。问题是ListView不知道这一点,因此您在位置5创建的视图可能在滚动后最终位于第7位。这是作为convertView参数传递的。

我愿意打赌你在LogCat中打印了大量的堆栈痕迹 - 这是一个非常重要的细节。

最简单的方法是检查你转换后的视图类型:

     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的倍数 - 涵盖您提到的所有案例。