我一直在嘗試更新我的圖片GridView。
只有當我再次設置適配器時,圖像纔會更新。再次設置適配器會使我的活動回滾到頂端,我儘量避免這種情況。圖片GridView不會失效
下面是一些代碼:
private class LoadImagesTask extends AsyncTask<Object,Void, Object> {
private ImageAdapter imageAdapter;
private ArrayList<Integer> idsArray;
@Override
protected void onPreExecute() {
imageAdapter = new ImageAdapter(getApplicationContext());
Bitmap bmap = BitmapFactory.decodeResource(getResources(),
R.drawable.locked_image);
idsArray = dbHelper.getPicturesIdsByAlbumId(1);
for(int i = 0;i<idsArray.size();i++){
imageAdapter.bitmaps.add(bmap);
}
gridView.setAdapter(imageAdapter);
}
@Override
protected Void doInBackground(Object... arg) {
for(int i = 0;i<idsArray.size();i++){
byte[] data = dbHelper.getPictureById(idsArray.get(i)).littlePicBytes;
imageAdapter.bitmaps.set(i, BitmapFactory.decodeByteArray(data, 0, data.length));
publishProgress(); //********** This line calls onProgressUpdate() *********
}
return null;
}
現在,此代碼更新的觀點:
@Override
protected void onProgressUpdate(Void... params) {
gridView.setAdapter(imageAdapter);
}
但這並不:
@Override
protected void onProgressUpdate(Void... params) {
imageAdapter.notifyDataSetChanged();
gridView.invalidateViews();
}
可能是什麼不是這個原因更新我的觀點?謝謝!
編輯:的ImageAdapter代碼:
公共類ImageAdapter延伸BaseAdapter { 私有上下文mContext; public ArrayList bitmaps = new ArrayList();公共ImageAdapter(Context c){ mContext = c;
}
public int getCount() {
return bitmaps.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(mContext);
// get layout from mobile.xml
gridView = inflater.inflate(R.layout.image_adapter, null);
// set image based on selected text
ImageView imageView = (ImageView) gridView
.findViewById(R.id.imageView);
imageView.setImageBitmap(bitmaps.get(position));
}
else{
gridView = (View) convertView;
}
return gridView;
}
}
可以請你告訴適配器本身的代碼嗎?順便說一句,調用notifyDataSetChanged應該足夠了。您也可以僅更新所需的視圖,而不是使所有項目無效。 –
@androiddeveloper使用ImageAdapter代碼編輯我的帖子。我意識到我可以只更新所需的視圖,但它無法正常工作:) – idish
你getView沒有正確實現。請閱讀關於它的更多信息,並觀看「listView的世界」(從adapterView擴展gridview和listview,所以它們的提示對於兩者都是相同的):http://www.google.com/events/io/2010/sessions /world-of-listview-android.html。我現在要寫下代碼中的錯誤,並提供如何糾正錯誤,但請仔細閱讀。 –