Android 列表视图项目回收

Android 列表视图项目回收,android,android-listview,android-viewpager,Android,Android Listview,Android Viewpager,我有一个14行的列表视图,每个项目都作为查看页面。下面是我的getView()方法: 问题:我面临的问题是,当我向下滚动列表视图时,我没有得到更多的行值,即列表视图与以前的值一起循环使用。我不知道为什么会这样。我必须发送查看页面(每个位置的数据项)。在向下滚动之前,一切正常。能否尝试在esle块中设置适配器 @Override public View getView(int position, View convertView, ViewGroup parent) {

我有一个14行的列表视图,每个项目都作为查看页面。下面是我的getView()方法:


问题:我面临的问题是,当我向下滚动列表视图时,我没有得到更多的行值,即列表视图与以前的值一起循环使用。我不知道为什么会这样。我必须发送查看页面(每个位置的数据项)。在向下滚动之前,一切正常。

能否尝试在esle块中设置适配器

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        FindMyBeerPager findMyBeerPager;
        if(convertView==null){
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.beer_list_item, parent,false);

            holder.beerPager = (ViewPager)convertView.findViewById(R.id.mypager);

            System.out.println("Recycling view position"+position);
            holder.beerPager.setTag(findMyBeerPager);

            convertView.setTag(holder);
        }
        else{
            holder = (ViewHolder) convertView.getTag();
            System.out.println("Recycled"+position);
            findMyBeerPager = new FindMyBeerPager(context, findBeerDataList.get(position));
            holder.beerPager.setAdapter(findMyBeerPager);
        }

        return convertView; 
    }
}
将getView更改为

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        FindMyBeerPager findMyBeerPager;
        if(convertView==null){
            holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.beer_list_item, parent,false);
            holder.beerPager = (ViewPager)convertView.findViewById(R.id.mypager);
            convertView.setTag(holder);
        }
        else{
            holder = (ViewHolder) convertView.getTag();
            }

         findMyBeerPager = new FindMyBeerPager(context, findBeerDataList.get(position));
             holder.beerPager.setTag(findMyBeerPager);
             holder.beerPager.setAdapter(findMyBeerPager);
        return convertView; 
    }
}
您可以移动
LayoutInflater充气器=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气器\u服务)到适配器类的构造函数

也可以使用
Log
而不是System.out.println进行日志记录


在上面的链接中检查Dianne Hackborn的答案。

它可以在不设置每个getView()上的参数的情况下工作,但为此,您需要扩展BaseAdapter并重载以下方法:

@Override
public boolean hasStableIds() {
    return true;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}

@Override
public int getViewTypeCount() {
    return MAXIMUM_NUMBER_OF_ITEMS_IN_LIST_VIEW;
}
这样,BaseAdapter将在recycler中为每个元素保留单独的视图。这是一个很好的解决方案,短列表中的每个项目都有自定义视图。(但在膨胀视图相同时也可以工作)

请注意,getViewTypeCount()只在构造函数上调用一次,所以BaseAdapter必须知道列表将包含多少项

这个想法的关键是getItemViewType()为每个项目返回不同的值。由于getView()将为每个列表项获得唯一的convertView


然后,您可以完全跳过条件(convertView!=null)并将所有代码放入(convertView==null){}

我知道这个解决方案,但使用这个解决方案并不能顺利工作,因为每次都要使用适配器set@GauravArora列表视图循环使用视图,这就是滚动时看不到任何内容的原因。如果你想在lisview中显示数据,你需要每次都设置它。@GauravArora我理解你的意思,但反复设置适配器会使listview难以滚动。或者,您能告诉我另一种方法来添加查看页面作为列表视图中的每个项目吗?我终于在视图翻转器的帮助下解决了我的问题。谢谢,我知道这个解决方案,但是使用这个解决方案并不能顺利工作,因为每次适配器都在运行set@Makachiasz. 回答得很好,但当我将getViewTypeCount设置为arraylist.size(),然后它给我一个异常——“getViewCount”不能小于1。如果我硬编码我的ViewCount值,那么它运行正常。我不想硬编码。请告诉我执行相同操作的方法您理解我的问题吗?正如我写的那样,getViewTypeCount()必须是硬编码的,因为它在BaseAdapter的构造函数中内部用于创建视图数组(视图视图[getViewTypeCount()])。因此,您也可以尝试在\u列表\u视图中传递\u项的最大\u数\u的值;在BaseAdapter构造函数的开头(超级之前)。就我个人而言,我在列表视图中的最大项目数为100,我从来没有更多的项目。这个数字不应该太大,因为视图数组会消耗内存。即使是空视图,也可以。那么这个解决方案对我没有帮助,因为我没有固定数量的值。谢谢,但是如果你知道你的最大值是多少,并且它不是很大,那么你可以硬编码它。getViewTypeCount()的数目可以大于ListView中的项数。
@Override
public boolean hasStableIds() {
    return true;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}

@Override
public int getViewTypeCount() {
    return MAXIMUM_NUMBER_OF_ITEMS_IN_LIST_VIEW;
}