【问题标题】:Android ListView "recycle" doesn't store rows which are not visible initiallyAndroid ListView“回收”不存储最初不可见的行
【发布时间】:2013-05-13 00:46:04
【问题描述】:

网上可能有数千篇关于 ListView 和 ListAdapter 回收过程的帖子,但到目前为止我无法解决我的问题。

我有自定义 ListView 行,并使用从远程服务器获取的数据填充行内的项目(TextViews、ImageViews 等)。屏幕一次最多可以显示 5 行,如果我有更多行,我必须滚动。问题是;适配器仅存储和回收前 5 行的信息,即使我滚动查看第 6、7、8 等行,我也会在随机位置一次又一次地看到相同的 5 行。

代码如下:

public class ListAdapter extends BaseAdapter {

    private ArrayList<String> id, name, address;
    private Context context;

    public ListAdapter(Context c, ArrayList<String> id,
            ArrayList<String> name, ArrayList<String> address,) {
        this.id = id;
        this.name = name;
        this.address = address;
        this.context = c;
    }

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

    @Override
    public Object getItem(int position) {
        return id.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View rowsLayout;

        if (convertView == null) {
            rowsLayout = (View)LayoutInflater.from(context)
                           .inflate(R.layout.list_item, null);
            //Assign values to TextViews in here
        } else {
            rowsLayout = convertView;
        }
            return rowsLayout;
    }
}

我尝试使用this website 中的方法,但没有帮助。

如果有人可以为我提供解决方案(请提供代码)或将我引导到另一个帖子,我将不胜感激。

【问题讨论】:

标签: android android-listview listadapter layout-inflater


【解决方案1】:

从此更改您的代码:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View rowsLayout;

    if (convertView == null) {
        rowsLayout = (View)LayoutInflater.from(context)
                       .inflate(R.layout.servisler_list_item, null);
        //Assign values to TextViews in here
    } else {
        rowsLayout = convertView;
    }
        return servisRowsLayout;
}

到这里:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View rowsLayout;

    if (convertView == null) {
        rowsLayout = (View)LayoutInflater.from(context)
                       .inflate(R.layout.servisler_list_item, null);
    } else {
        rowsLayout = convertView;
    }

        //Assign values to TextViews in here

        return servisRowsLayout;
}

您需要在每个 getView() 调用中“将值分配给TextViews”,而不仅仅是其中一些。

【讨论】:

  • 我应该在我的原始帖子中提到这一点;我不能这样做,因为我在行中有太多项目(包括图像)并且它会严重减慢滚动速度。我正在寻找一种方法来禁用回收并永久保留行,因为在给定时间我永远不会超过 15-16 行。
  • @EnginYapici:“我不能这样做,因为我的行中有太多项目(包括图像)并且它会严重减慢滚动速度”——那么你在主应用程序线程上做错了,例如从磁盘/网络加载图像。 “我正在寻找一种方法来禁用回收并实际上永久保留行,因为在给定时间我永远不会超过 15-16 行”——覆盖 getViewTypeCount() 以返回 getCount() 并返回 getItemViewType() 到返回position,因此Android 认为每一行都是唯一的。没试过,但应该可以。
  • @EnginYapici:请注意,我描述的 hack 仍然比一开始就解决性能问题要糟糕得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2013-04-25
  • 2015-06-09
相关资源
最近更新 更多