Просмотр адаптера Android?

В документах говорится:

Если содержимое вашего макета является динамическим или не задано заранее, вы можете использовать макет, который является подклассом AdapterView, для заполнения макета представлениями во время выполнения. Подкласс класса AdapterView использует адаптер для привязки данных к его макету.

Но большинство руководств находятся примерно в ListView, GridView, Spinner и Gallery.

Я хочу расширить подкласс непосредственно из AdapterView. Мне нужно создать собственное представление, чтобы его содержимое зависело от адаптера.

Как я могу это сделать, и какие методы должны быть переопределены?


person Student Student    schedule 04.02.2013    source источник


Ответы (5)


Во-первых, вы должны быть абсолютно уверены, что AdapterView — это то, что вам нужно, потому что не все «динамические или не предопределенные» представления могут быть реализованы через AdapterView. Иногда вам лучше создать свое представление, расширяющее ViewGroup.

если вы хотите использовать AdapterView, посмотрите это действительно хороший пример. На GitHub есть много пользовательских представлений с адаптером. Проверьте это (расширяет ViewGroup).

person Leonidos    schedule 08.02.2013

Это может быть не полный ответ на ваш вопрос, но я показываю вам, скорее всего, отправную точку или указатель, который может вам помочь:

Учебники Sony для разработчиков — 3D ListView

person Nezam    schedule 14.02.2013

ListView расширяет AbsListView, который, в свою очередь, расширяет AdapterView<ListAdapter>. Поэтому, если вам абсолютно необходимо реализовать такое пользовательское представление с нуля, вы можете взглянуть на исходный код этих классов:

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

person Ridcully    schedule 07.02.2013

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

Например, AdapterView управляет индексом выбранного элемента для AbsListView и ListView. Однако, поскольку такие методы, как setNextSelectedPositionInt(int position) (это единственный путь к настройке mNextSelectedPosition), являются частными для пакета, мы не можем получить к ним доступ. AbsListView и ListView могут добраться до них, потому что они в одном пакете, а мы не можем.

(Если вы покопаетесь в исходном коде AdapterView, вы обнаружите, что setNextSelectedPositionInt() вызывается из handleDataChanged(). К сожалению, handleDataChanged() также является частным пакетом и _not_called из любого другого места в пределах AdapterView, которое можно использовать для включения установки позиции.)

Это означает, что если вам нужно управлять выбранной позицией, вам нужно будет воссоздать эту инфраструктуру в вашем производном классе (или вам нужно будет получить от ListView или AbsListView... хотя я подозреваю, что вы столкнетесь с аналогичными проблемами, происходящими от AbsListView). Это также означает, что любая функция AdapterView, связанная с выбором элементов, скорее всего, не будет работать в полной мере.

person TechnalyticSteve    schedule 09.09.2013

Вы можете создать что-то вроде этого:

public class SampleAdapter extends BaseAdapter {

public SampleAdapter() {
  // Some constructor
}

public int getCount() {
  return count; // Could also be a constant. This indicates the # of times the getView gets invoked.
}

public Object getItem(int position) {
    return position; // Returns the position of the current item in the iteration
}

public long getItemId(int position) {
  return GridView.INVALID_ROW_ID;
}

public View getView(int position, View convertView, ViewGroup parent) {
  View view = null;

  view = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.some_layout, null);
  view.setLayoutParams(new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
view.setBackgroungColor(Color.RED);

  return view;
}

}

И это может быть вызвано так:

GridView sampleView = (GridView) linearLayout.findViewById(R.id.sample_layout);
sampleView.setAdapter(new SampleAdapter());
person lokoko    schedule 04.02.2013
comment
Спасибо, но мой вопрос не о how create an adapter for a view, мой вопрос касается how to create a custom view that it's content determined by an adapter? (это представление называется AdapterView. - person Student Student; 04.02.2013
comment
это не то, о чем он @StudentStudent спрашивает. - person QAMAR; 04.02.2013