Android AdapterView?

документы говорят:

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

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

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

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

5 ответов


во-первых, вы должны быть абсолютно уверены в том, что AdapterView Это то, что вы хотите, потому что не все "динамические или не предопределенные" представления могут быть реализованы через AdapterView. Иногда вам лучше создать свой вид ViewGroup.

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


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

Sony Developer Tutorials-3D ListView


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

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


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

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

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

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


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

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());