如何更新进度条以外的适配器?

时间:2012-11-02 07:41:13

标签: android adapter

我有一个自定义适配器,可以在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项时,它会下载相应的文件,并且进度条可见。但是当我调用notifyDatasetChanged()时,进度条保持其初始状态。

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

由于

1 个答案:

答案 0 :(得分:0)

当您执行notifyDatasetChanged()时 - 将为列表中的所有可见项调用getView。你的进步被破坏了,因为这是一个新观点。如果convertedView与前一个视图相同,则可以使用convertView并检查(通过列表中的字符串值)。如果在大多数情况下不移动列表,则convertView应该是完全相同的视图,您可以进行更改并返回它。这将是相同的progressBar,所以进步不会丢失。 为了使其在所有情况下都能正常工作,您应该记住所有当前下载项目的进度(例如字符串的Hashmap,整数名称 - >进度),并获取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为null时才应该给视图充气,否则你应该更新它并使用它。这总是一种从屏幕上消失的观点。

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