1

我需要在 listview(android) 中维护 3000 个列表项。但继续滚动会出错。为了管理这个,我计划在加载列表视图时显示进度对话框。

请建议我如何在android中做到这一点。

4

2 回答 2

1

您可以使用惰性列表来解决您的问题,这里是链接检查。你可以找到你的解决方案。您可以使用异步任务,但将一次加载全部 3000 个项目。如果您使用 LazyList,那么您将首先加载几个项目,当您向下滚动时,更多项目将添加到您的列表中。

于 2013-02-18T06:46:01.360 回答
0

ListView 本身就是一个出色的组件,可用于呈现 n 条记录。 *同一个视图有一次又一次的回收,避免内存泄漏和高效管理。*

您必须使用:必须有效管理图像和视图持有者的惰性列表,以管理视图的可重用性。

回收理念:

每次 ListView 需要在屏幕上显示新行时,它都会从其适配器调用 getView() 方法。如您所知,getView() 接受三个参数参数:行位置、convertView 和父 ViewGroup。

convertView 参数本质上是一个“ScrapView”。当 ListView 要求您回收行布局时,它将具有非空值。因此,当 convertView 不为空时,您应该简单地更新其内容而不是膨胀新的行布局。适配器中的 getView() 代码看起来有点像:

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.your_layout, null);
    }

    TextView text = (TextView) convertView.findViewById(R.id.text);
    text.setText("Position " + position);

    return convertView;
}

View Holder 模式 在膨胀的布局中查找内部视图是 Android 中最常见的操作之一。这通常通过一个名为 findViewById() 的 View 方法来完成。此方法将递归地遍历视图树以查找具有给定 IDcode 的子项。在静态 UI 布局上使用 findViewById() 完全没问题,但正如您所见,ListView 在滚动时非常频繁地调用适配器的 getView()。findViewById() 可能会明显影响 ListViews 中的滚动性能——尤其是在您的行布局非常重要的情况下。

View Holder 模式是关于减少适配器的 getView() 中调用 findViewById() 的次数。实际上,View Holder 是一个轻量级的内部类,它保存对一行中所有内部视图的直接引用。充气后将其作为标签存储在行视图中。这样,您只需在首次创建布局时使用 findViewById()。这是之前应用了 View Holder 模式的代码示例:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.your_layout, null);

        holder = new ViewHolder();
        holder.textView01 = (TextView) convertView.findViewById(R.id.text);

        convertView.setTag(holder);
    } else {
        holder = convertView.getTag();
    }

    holder.textView01.setText("Position " + position);

    return convertView;
}

private static class ViewHolder {
    public TextView textView01;
}
于 2013-02-18T07:23:14.960 回答