Adición de diferentes tipos de elementos a una vista de lista

¿Hay un buen tutorial o vínculo que muestra cómo agregar elementos diferentes a un listview?
Por ejemplo, uno con dos líneas de texto y un cuadro de verificación , otro que sólo presione yy algo surgiría. Todo lo que tengo ahora es cada elemento de la lista es la misma vista de dos líneas de texto y casilla de verificación …
O , si hay una manera de agregar una fila a la vez con un diseño diferente a través de 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; 

En mi ejemplo, la actividad de la lista que mostrará nuestra vista de lista personalizada se llama OptionsActivity, porque en mi proyecto esta actividad va a mostrar las diferentes opciones que mi usuario puede configurar para controlar mi aplicación. Hay dos tipos de elementos de lista, un tipo de elemento de lista sólo tiene un TextView y el segundo tipo de elemento de lista sólo tiene un botón. Puedes poner cualquier widgets que te guste dentro de cada tipo de elemento de lista, pero he mantenido este ejemplo simple.

El método getItemView comprueba que los elementos de la lista deben ser de tipo 1 o tipo 2. De acuerdo con mis ints estáticos definidos arriba, los primeros 5 elementos de lista serán tipo de elemento de lista 1 y los últimos 5 elementos de lista serán tipo de elemento de lista 2. Así que si compila y ejecuta esto, tendrá un ListView que tiene cinco elementos que sólo contienen un botón y, a continuación, cinco elementos que sólo contienen un TextView.

A continuación se muestra el código de actividad, el archivo xml de actividad y un archivo xml para cada tipo de elemento de lista.

OpcionesActivity.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> 

Usted tiene dos posibilidades para hacer eso:

  • Cree un tipo y compruebe su tipo y devuelva la vista relacionada con este tipo.
  • BaseAdapter tiene dos métodos para comprobar diferentes elementos en él, getItemViewType(int position) y getViewTypeCount() . Haga sus cosas allí.

Compruebe este tutorial:

ListView con varias filas

Debe crear su propia clase extendiendo BaseAdapter . Te recomiendo que veas The World of ListView , te ayudará a entender todo lo que necesitas saber sobre cómo trabajar con ListView.

  • ¿Cómo puedo utilizar el botón OnClick en ListView personalizado con View Holder
  • Pinch Android y Zoom de la imagen en la actividad
  • Configuración del color de fondo de los elementos ListView en el botón
  • Android ListView con encabezado y pie de página fijos
  • Cómo obtener la lista de datos en Tabbed Actvity?
  • Duplicación de filas listview en el fragmento de lista en el cambio de orientación
  • Prohibir toques de interceptación de Listview mientras utiliza su Child MapView
  • Android muestra texto cuando ListView está vacío
  • Custom SimpleAdapter sólo muestra texto de ejemplo Android
  • Listview con arraylist, adaptador simple en android
  • Acceso a vistas de otro elemento de ListView desde algún elemento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.