Обновить содержимое GridView с помощью пользовательского BaseAdapter

Я пытался найти решение этой проблемы в течение нескольких дней, и я в тупике.

Вот что у меня есть до сих пор:

Пользовательский класс BaseAdapter:

        public static class ImageAdapter extends BaseAdapter {
        private static LayoutInflater mInflater;
        // Keep all Images in array
        private static Bitmap[] mThumbIds;
        private static int mViewResourceId, pos;
        private static CheckBox cb;
        // Constructor
        public ImageAdapter(Context ctx, int viewResourceId, Bitmap[] pics) {
            mInflater = (LayoutInflater) ctx
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mThumbIds = pics;
            mViewResourceId = viewResourceId;
        }

        @Override
        public int getCount() {
            return mThumbIds.length;
        }

        @Override
        public Object getItem(int position) {
            return mThumbIds[position];
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @SuppressWarnings("deprecation")
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = mInflater.inflate(mViewResourceId, list, false);
            cb = (CheckBox) convertView.findViewById(R.id.select);
            Drawable background = new BitmapDrawable(mThumbIds[position]);
            cb.setBackgroundDrawable(background);
            pos = position;
            System.out.println("Setting checkbox set: "+imageIsDup[pos]);
            cb.setChecked(imageIsDup[pos]);
            System.out.println("Has checkbox been set? "+cb.isChecked());
            cb.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    if (cb.isChecked()) {
                        imageIsDup[pos] = true;
                    } else
                        imageIsDup[pos] = false;
                }
            });
            return convertView;
        }
    }

Код для настройки gridView:

final Dialog dialog = new Dialog(longOperationContext);
                    dialog.setContentView(R.layout.activity_list);
                    TextView no = (TextView) dialog
                            .findViewById(R.id.noOfDups);
                    no.setText("Found " + noOfImages
                            + " duplicates. Please verify.");
                    dialog.setTitle("Images Found");
                    dialog.setCancelable(false);
                    list = (GridView) dialog
                            .findViewById(R.id.grid_view);
                    ImageAdapter empty=new ImageAdapter(longOperationContext, R.layout.row, new Bitmap[0]);
                    imageAdapter = new ImageAdapter(
                            longOperationContext, R.layout.row, thumb);
                    dialog.show();
                    imageAdapter.notifyDataSetChanged();
                    list.invalidateViews();
                    list.setAdapter(empty);
                    list.setEmptyView(new View(longOperationContext));
                    list.invalidateViews();
                    list.setAdapter(imageAdapter);

Я предположил, что этот код сначала установит gridView в пустое представление, а затем в содержимое адаптера.

Я читал в документации, что функции removeView нельзя вызывать, так как они выдают Unsupported Exception. Как очистить предыдущее содержимое сетки, если оно есть, и установить новое содержимое?


person Karthik Balakrishnan    schedule 09.05.2013    source источник
comment
Вы устанавливаете содержимое сразу же, когда устанавливаете его пустым. Даже если отображается пустой вид, вы можете этого не заметить.   -  person Bolton    schedule 09.05.2013
comment
Нет, дело в том, что он не обновляет мое содержимое. Это просто добавление большего количества вещей к предыдущим вещам.   -  person Karthik Balakrishnan    schedule 09.05.2013
comment
Тогда я думаю, что проблема может заключаться в том, что вы никогда не очищаете большой палец массива растровых изображений.   -  person Bolton    schedule 09.05.2013
comment
Я не. Я просто хотел бы очистить gridView и снова добавить содержимое.   -  person Karthik Balakrishnan    schedule 09.05.2013
comment
Я имею в виду, что вы правильно очищаете gridview, проблема в том, что контент в адаптере может содержать элементы, которые дублируются, потому что вы добавили их дважды.   -  person Bolton    schedule 09.05.2013
comment
Хорошо, тогда есть способ не добавлять повторяющееся содержимое?   -  person Karthik Balakrishnan    schedule 09.05.2013


Ответы (2)


Вся идея с обновлением элементов адаптера в Android заключается в том, чтобы просто повторно заполнить их, используя тот же массив объектов. Например, если у меня есть GridView, как в вашем случае, и я хочу повторно заполнить объекты, вам нужно сначала объявить массив объектов:

private ArrayList<Object> mMyObjects;

заполните его данными и создайте свой адаптер.

@Override
public void onCreate(Bundle savedInstanceState){
       super.onCreate(savedInstanceState);

       mMyObjects = new ArrayList<Object>();
       mMyObject.add("StringObject"); // just an example
       mMyAdapter = new MyCustomAdapter(this, mMyObject);
       mMyGridView.setAdapter(mMyAdapter);
}

Итак, мы заполняем массив объектов и создаем наш адаптер. То, что мы должны сделать перед обновлением дочерних элементов адаптера/сетки, это просто повторно заполнить ваш массив:

mMyObjects.clear();
mMyObjects.add("NewStringObject");

и вызовите: mMyAdapter.notifySetDataChanged(); Делая это, BaseAdapter знает, что в наших данных есть изменения, и он перерисовывает свои представления, и ваш ListView / GridView будет обновлен новыми элементами.

Итак, в вашем случае, чтобы обновить ваш GridView, просто нужно очистить массив растровых изображений и заполнить его заново.

person hardartcore    schedule 09.05.2013
comment
Обратите внимание, что я использую массив Bitmap[] вместо ArrayList. Нельзя ли просто снять старый адаптер и поставить новый? Если я могу, как мне это сделать? - person Karthik Balakrishnan; 09.05.2013
comment
ArrayList — это просто пример, вы можете использовать любой массив и повторно заполнить его или создать новый адаптер и установить его в свой GridView. Это зависит от тебя. Вы можете сделать это, просто создав новый адаптер, используя новый Bitmap[], и установите его на свой GridView. Это все. - person hardartcore; 09.05.2013
comment
Если вы видите мой код, я создаю новый экземпляр того же адаптера и устанавливаю его. Разве он не должен делать то же самое? - person Karthik Balakrishnan; 09.05.2013

Я решил свою проблему с помощью этого фрагмента кода:

                    try{
                            imageAdapter.notifyDataSetChanged();
                        }
                        catch(NullPointerException e)
                        {
                            imageAdapter = new ImageAdapter(
                                    longOperationContext, R.layout.row, thumb);
                        }
person Karthik Balakrishnan    schedule 16.05.2013