Добавление различных типов элементов в виде списка

Есть ли хороший учебник или ссылка, которая показывает, как добавить разные элементы в список?
Например, один с двумя текстовыми строками и флажок , другой, который вы просто нажимаете, и что-то появляется. Все, что у меня есть, это каждый элемент списка – это одно и то же двухстрочное текстовое представление и флажок …
Или , если есть способ добавить 1 строку за раз с другой компоновкой через R.layout.xxx ?

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRoot = inflater.inflate(R.layout.frag_settings, container, false); mItems = getResources().getStringArray(R.array.setting_items); mItemDescription = getResources().getStringArray(R.array.setting_item_descriptions); mItemListView = (ListView) mRoot.findViewById(R.id.lvMainListView); ArrayAdapter<String> lvRowTitle = new ArrayAdapter<String>(getActivity(), R.layout.setting_twolinetext_checkbox, R.id.tvRowTitle, mItems); mItemListView.setAdapter(lvRowTitle); ArrayAdapter<String> lvRowDesc = new ArrayAdapter<String>(getActivity(), R.layout.setting_twolinetext_checkbox, R.id.tvRowDesc, mItemDescription); mItemListView.setAdapter(lvRowDesc); return mRoot; 

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

Метод getItemView проверяет, какие элементы списка должны быть типа 1 или типа 2. Согласно моим статическим ints, которые я определил вверху, первые 5 элементов списка будут элементами списка 1, а последние 5 элементов списка будут типами элементов списка 2. Итак, если вы скомпилируете и запустите это, у вас будет ListView, в котором есть пять элементов, которые содержат только кнопку, а затем пять элементов, которые просто содержат TextView.

Ниже приведен код активности, xml-файл активности и XML-файл для каждого типа списка.

OptionsActivity.java:

 public class OptionsActivity extends ListActivity { private static final int LIST_ITEM_TYPE_1 = 0; private static final int LIST_ITEM_TYPE_2 = 1; private static final int LIST_ITEM_TYPE_COUNT = 2; private static final int LIST_ITEM_COUNT = 10; // The first five list items will be list item type 1 // and the last five will be list item type 2 private static final int LIST_ITEM_TYPE_1_COUNT = 5; private MyCustomAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new MyCustomAdapter(); for (int i = 0; i < LIST_ITEM_COUNT; i++) { if (i < LIST_ITEM_TYPE_1_COUNT) mAdapter.addItem("item type 1"); else mAdapter.addItem("item type 2"); } setListAdapter(mAdapter); } private class MyCustomAdapter extends BaseAdapter { private ArrayList<String> mData = new ArrayList<String>(); private LayoutInflater mInflater; public MyCustomAdapter() { mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void addItem(final String item) { mData.add(item); notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if(position < LIST_ITEM_TYPE_1_COUNT) return LIST_ITEM_TYPE_1; else return LIST_ITEM_TYPE_2; } @Override public int getViewTypeCount() { return LIST_ITEM_TYPE_COUNT; } @Override public int getCount() { return mData.size(); } @Override public String getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; int type = getItemViewType(position); if (convertView == null) { holder = new ViewHolder(); switch(type) { case LIST_ITEM_TYPE_1: convertView = mInflater.inflate(R.layout.list_item_type1, null); holder.textView = (TextView)convertView.findViewById(R.id.list_item_type1_text_view); break; case LIST_ITEM_TYPE_2: convertView = mInflater.inflate(R.layout.list_item_type2, null); holder.textView = (TextView)convertView.findViewById(R.id.list_item_type2_button); break; } convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } holder.textView.setText(mData.get(position)); return convertView; } } public static class ViewHolder { public TextView textView; } } 

activity_options.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/optionsList" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> 

list_item_type_1.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item_type1_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/list_item_type1_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Text goes here" /> </LinearLayout> 

list_item_type2.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item_type2_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/list_item_type2_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button text goes here" /> </LinearLayout> 

У вас есть две возможности сделать это:

  • Создайте тип и проверьте тип и верните представление, относящееся к этому типу.
  • BaseAdapter имеет два метода проверки различных элементов в нем: getItemViewType(int position) и getViewTypeCount() . Сделайте там свои вещи.

Проверьте это руководство:

ListView с несколькими строками

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

Intereting Posts
Получить фактическую высоту обзора Как отключить режим сдвига BottomNavigationView? IntelliJ / структурный поиск: удаление бесполезных методов, которые вызывают только метод super Есть простой способ конвертировать приложение Android в IPad, IPhone Вставка из AccessibilityService в API22 не работает в API17 Android, GWT & App Engine: Cloud Endpoints против GWT RPC? Часть-2 постоянная foreGround служба Android, которая начинается с пользовательского интерфейса, работает в спящем режиме, также запускается при перезагрузке телефона RecyclerView.getChild (index) показывает null, когда список прокручивается (индекс перепутался) Запланированный будильник, чтобы повторять каждую минуту часов Строка для charsequence Невозможно изменить валюту по умолчанию для выставления счетов в приложении Как вычесть х количество дней с сегодняшнего дня Tools.jar не находится в интерфейсе классов Studio Studio Bootstrap 3 длинных модальных прокрутки на Android Выпадающая стрелка Android Spinner не отображается