2016-06-15 3 views
1

Я немного разбираюсь в пользовательских массивах ArrayAdapters для ListViews, и, расширяя их, я всегда просто передавал -1 (несуществующий идентификатор ресурса) в качестве аргумента ресурса super. Есть ли какие-либо потенциальные выгоды (вообще) для передачи чего-либо еще в этом месте, когда вы также переопределяете getView?При расширении массива ArrayAdapter и переопределении getView передаются аргументы resource/textViewResourceId полностью избыточными?

ответ

1

Есть ли какие-либо потенциальные преимущества (вообще) для передачи чего-либо еще в этом месте, когда вы также переопределяете getView?

Конечно. Если вы передадите свой фактический макет и TextView Идентификатор ресурса, вы можете позволить методу super.getView() обрабатывать инфляцию и назначать текст на одном TextView. Тогда ваш getView() переопределить просто нужно «заполнить пробелы».

Например, скажем, мы имеем следующий простой класс элемента списка:

public class Item { 
    String text; 
    int imageResId; 

    public Item(String text, int imageResId) { 
     this.text = text; 
     this.imageResId = imageResId; 
    } 

    @Override 
    public String toString() { 
     return text; 
    } 
} 

И простой макет элемента, как так:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical"> 

    <ImageView android:id="@+id/item_image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView android:id="@+id/item_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

Тогда наш ArrayAdapter подкласс может быть просто:

public class MyAdapter extends ArrayAdapter<Item> { 
    public MyAdapter(Context context, List<Item> items) { 
     super(context, R.layout.list_item, R.id.item_text, items); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent); 

     ((ImageView) v.findViewById(R.id.item_image)) 
      .setImageResource(getItem(position).imageResId); 

     return v; 
    } 
} 

Обратите внимание, что мы реализуем переопределение toString() в нашей Item класс для обеспечения правильного String до ArrayAdapter.

+0

Это была моя первая мысль, она быстро пробовала, но пренебрегала вызовом super.getView. Очень хорошо собрал пример, который может по крайней мере вырезать пару строк, спасибо :) –

+1

Нет проблем. Следует отметить, что если вы передаете недопустимый ресурс компоновки в конструкторе, вы не хотите называть 'super.getView()', или вы получите «Ресурсы $ NotFoundException». –

1
super(context, R.layout.list_item_layout, R.id.item_text_inside_layout, items); 

3-й параметр полезен, если вы хотите использовать пользовательский макет для ListView/Gridview.

ArrayAdapter использует Object.toString(), чтобы получить значение каждого элемента в Listview. Он должен иметь TextView для отображения. Итак, у вас есть три варианта:

  1. Используйте макет по умолчанию для текстового элемента. например android.R.layout.simple_list_item_1

  2. Используйте настраиваемый макет для текстового элемента и предоставляйте textViewId для размещения ваших данных. super(context, R.layout.list_item_layout, R.id.item_text_inside_layout, items);

  3. Используйте специальный адаптер, а не ArrayAdapter. Вы можете расширить BaseAdapter и раздуть, какой вид вы хотите

Надеюсь, что это поможет!

+0

Я смотрел на документ и думал, что getView был объявлен только в ArrayAdapter, поэтому было смущено точно о том, как именно работала Base или ListAdapter, я видел ваш комментарий и так немного поработал в документах и ​​увидел, что он был фактически объявлен в Adapter -дох! - спасибо, мне нужно немного больше привыкнуть к навигации по документации :) –

Смежные вопросы