Изображения 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 extends BaseAdapter {закрытый контекст mContext; public ArrayList bitmaps = new ArrayList (); public 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;
}

}

1 ответ

Решение

У вас есть 2 основные проблемы в вашем коде:

  1. в doInBackground вы изменяете данные адаптера, что не является потокобезопасной операцией, поскольку адаптер может теперь считывать данные, когда вы их меняете. я говорю об этой строке:

    imageAdapter.bitmaps.set(i, BitmapFactory.decodeByteArray(data, 0, data.length));
    

    вместо этого вы должны обновлять его данные только в потоке пользовательского интерфейса, например, внутри onProgressUpdate .

  2. в getView вы неправильно его реализовали. когда convertView не равен нулю, вы никогда не обновите содержимое imageView. то, что должно быть что-то вроде:

public View getView(int position, View convertView, ViewGroup parent) 
  {
  View rootView=convertView;
  ViewHolder holder;
  if (rootView != null) 
    holder=(ViewHolder) rootView.getTag();
  else
    {
    rootView = inflater.inflate(R.layout.image_adapter, null,false);
    holder = new ViewHolder();
    holder.imageView = (ImageView) rootView.findViewById(R.id.imageView);
    rootView.setTag(holder);
    }
  holder.imageView.setImageBitmap(getItem(position));
  return rootView;
  }


private Bitmap getItem(final int position)
  {
  return bitmaps.get(position); 
  }    

private static class ViewHolder
  {
  ImageView imageView;
  }
Другие вопросы по тегам