1

我有一个自定义适配器来在 gridview 中显示一些图像。

public class CustomAdapter extends BaseAdapter {


    private Context context;

    ArrayList<String> list = null;


    public CustomAdapter (Context context, ArrayList<String> list) {
        this.context = context;
        this.list = list;
    }

    l
    public int getCount() {
        return list.size();
    }


    public Object getItem(int paramInt) {
        return paramInt;
    }


    public long getItemId(int paramInt) {
        return paramInt;

    }


    public View getView(int position, View child, ViewGroup parent) {
        String string= list.get(position);
        Bitmap bitmap = null;
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.grid_item, null);
        RelativeLayout parentLayout = (RelativeLayout) view
                .findViewById(R.id.parentLayout);

        ImageView iView = (ImageView) view.findViewById(R.id.imageView);
        final ProgressBar progress = (ProgressBar) view.findViewById(R.id.progress);

        if (string != null) {
            bitmap = BitmapFactory.decodeFile(string);
        } else {
            bitmap = BitmapFactory.decodeResource(context.getResources(),
                    R.drawable.img_loading);
        }
        iView.setImageBitmap(bitmap);
        iView.setTag(position);

        return view;
    }


}

这是GridView的适配器。选择GridView项时,它会下载相应的文件,并且ProgressBar使可见。但是当我调用 notifyDatasetChanged() 时,进度条保持其初始状态。

即使调用 notifyDatasetChanged(),我如何保持/显示进度条的状态/进度?

谢谢

4

1 回答 1

0

当您执行 notifyDatasetChanged() 时 - 为列表中的所有可见项目调用 getView。你的进步被破坏了,因为它是一个新的观点。一项优化可能是使用 convertView 并检查(通过列表中的字符串值)convertedView 是否与以前的视图相同。当您在大多数情况下不移动列表时,convertView 应该是完全相同的视图,您可以进行更改并返回它。这将是相同的progressBar,因此不会丢失进度。为了使它在所有情况下都能正常工作,您应该记住所有当前下载项目的进度,例如(字符串的哈希图、整数所以 name->progress)并在 getView 方法中获取当前进度。

getView(...){
   String string= list.get(position);
   Integer progress = map.get(string);
   if (progress != null){
      final ProgressBar progress = (ProgressBar) view.findViewById(R.id.progress);
      progress.setProgress(progress);
   }
   ....
}

PS。在您的代码中,我看到:

public View getView(int position, View child, ViewGroup parent)

getView 中的第二个参数不是“子”而是“convertView” - 用于优化列表。主要思想是只有在 convertView 为空时才应该为视图充气,否则应该更新并使用它。这总是从屏幕上消失的视图。

编辑:我忘了一件事。我想在下载过程中你会更新进度条。您的下载器任务保留对他更新的 ProgressBar 的引用。您将需要给他您的新进度条或保存他正在使用的进度条(例如 HashMap String -> ProgressBar 而不是 Integer)并以某种方式在您的 getView 方法中使用它。例如 addChild... 当您确保这始终是 ProgressBar 的同一个实例时 - 一切都会正常工作:)

于 2012-11-02T07:55:12.017 回答