我有一个自定义适配器,可以在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(),如何保持/显示进度条的状态/进度?
由于
答案 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的同一个实例时 - 一切都会正常工作:)