Что требуется для работы в качестве адаптера с setAdapter()?

Рассматриваемый AdapterView — это GridView. Мне интересно, что именно подразумевается под «метод setAdapter() затем устанавливает пользовательский адаптер (ImageAdapter) в качестве источника для всех элементов, отображаемых в сетке». в этом официальном руководстве по Android. Это метод getView()?

Моя цель — создать представление сетки, которое получает данные от директора SD-карты, а не от папки ресурсов. Поэтому вместо работы с идентификаторами ресурсов я буду работать с абсолютными путями.

Я пытаюсь установить что-то вроде:

    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1);        
    gridview.setAdapter(new ImageAdapter(this, mImgFilenames));

С адаптером изображения:

public class ImageAdapter extends BaseAdapter {
private Context mContext;
private List<String> mPaths;

// Store the list of image IDs
public ImageAdapter(Context c, List<String> paths) {
    mContext = c;
    this.mPaths = paths;
}

// Return the number of items in the Adapter
@Override
public int getCount() {
    return mPaths.size();
}

// Return the data item at position
@Override
public Object getItem(int position) {
    return mPaths.get(position);
}

// Will get called to provide the ID that
// is passed to OnItemClickListener.onItemClick()
@Override
public long getItemId(int position) {
    return 0;
}

// Return an ImageView for each item referenced by the Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView = (ImageView) convertView;
    if (imageView == null) {
     //typical code for new view
    }

    //load the image    
    Bitmap bmImg = BitmapFactory.decodeFile((String) getItem(position));
    imageView.setImageBitmap(bmImg);
    return imageView;
}

}

Поэтому я говорю не об обязательных методах реализации, а о том, что требуется от инфраструктуры адаптера, чтобы она служила таковой. Говоря об этом, я понятия не имею, что должен возвращать getItemId.


comment
Поскольку данные вашей модели имеют вид List, почему бы не использовать ArrayAdapter? Это было бы намного проще.   -  person CommonsWare    schedule 30.11.2014
comment
В ImageAdapter? Разве поле там (mPaths) не должно быть фактической базой данных, например массивом или списком или чем-то еще, а не адаптером?   -  person PIXP    schedule 30.11.2014
comment
Нет, я имею в виду, что ваш ImageAdapter должен расширять ArrayAdapter, а не BaseAdapter. Тогда вам действительно нужно беспокоиться только о getView() и ни о чем другом.   -  person CommonsWare    schedule 30.11.2014
comment
Большой! Будет менять! А затем переопределить конструктор, чтобы загрузить все файлы из абсолютных путей? Если да, то как вручную добавить пути к фактическому массиву?   -  person PIXP    schedule 30.11.2014


Ответы (1)


Ваш ImageAdapter должен расширять ArrayAdapter, а не BaseAdapter. Тогда вам действительно нужно беспокоиться только о getView() и ни о чем другом.

А затем переопределить конструктор, чтобы загрузить все файлы из абсолютных путей?

Загрузите изображения асинхронно, используя такую ​​библиотеку, как Picasso. Не выполняйте дисковый ввод-вывод в основном потоке приложения. Вы можете сделать это в самом getView(), так как нужны изображения.

как добавить пути вручную к фактическому массиву?

У вас уже есть массив путей. Он называется paths (как параметр конструктора вашего текущего ImageAdapter) и mPaths (как элемент данных вашего текущего ImageAdapter).

person CommonsWare    schedule 29.11.2014
comment
Я знаю, что это путь. Но что делать с этим требованием TextView в каждом конструкторе? - person PIXP; 30.11.2014
comment
@PIXP: есть конструкторы, которые не принимают идентификатор TextView. Отсутствие идентификатора TextView означает, что вы не можете привязать к super.getView(), но в остальном все должно быть в порядке. - person CommonsWare; 30.11.2014
comment
С ArrayAdapter кажется, что все конструкторы так или иначе требуют этого: developer.android. ком/ссылка/андроид/виджет/ - person PIXP; 30.11.2014
comment
@PIXP: Нет, только половина. Все принимают идентификатор ресурса макета, потому что обычно строка/ячейка/что-то более сложное, чем простое ImageView. Вы должны иметь возможность просто передать 0 туда. - person CommonsWare; 30.11.2014