¿Cómo configurar el adaptador en caso de múltiples vistas de texto por lista?

Tengo varios TextView s por el artículo de la lista en mi ListView . He aprendido a escribir un método getView adecuado, pero creo que no estoy seguro de que he de utilizar setAdapter para llamar a ese método.

 private static String[] project = {"proj1","proj2"}; private static String[] workRequests = {"requirement gathering", "design"}; private static String[] startDate = {"02/21/2012","07/15/2011"}; private static String[] status = {"WIP","DONE"}; ListView mListView; public class MyDashboardActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mydashboard); final LayoutInflater mInflater = LayoutInflater.from(this); mListView = (ListView)findViewById(R.id.dashboardList); mListView.setAdapter( // How do I set the adapter? ); } public View getView(int position, View convertView, ViewGroup parent) { System.out.println("enters"); if(convertView == null){ convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); } ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); return convertView; } 

Este es el diseño xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/home_root" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- Include Action Bar --> <include layout="@layout/actionbar_layout" /> <ListView android:id="@+id/dashboardList" style="@style/LeftHeaderText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:background="@drawable/innerdashboard_bg" android:textColor="@color/textColor" > <TextView android:id="@+id/project" /> <TextView android:id="@+id/work_request" /> <TextView android:id="@+id/start_date" /> <TextView android:id="@+id/status" /> </ListView> </LinearLayout> 

He intentado algunas maneras, ninguna de las cuales funcionó. ¿Podría alguien por favor sugerir cómo configurar el adaptador en este caso? ¡Gracias!

Necesita implementar su propio adaptador. Mi manera es también definir un objeto que "representa" una vista.

A continuación, hay un ejemplo muy simple con dos TextViews para adaptarse a sus necesidades.

El objeto que representa una vista (una fila en el ListView):

 public class CustomObject { private String prop1; private String prop2; public CustomObject(String prop1, String prop2) { this.prop1 = prop1; this.prop2 = prop2; } public String getProp1() { return prop1; } public String getProp2() { return prop2; } } 

A continuación, el adaptador personalizado:

 public class CustomAdapter extends BaseAdapter { private LayoutInflater inflater; private ArrayList<CustomObject> objects; private class ViewHolder { TextView textView1; TextView textView2; } public CustomAdapter(Context context, ArrayList<CustomObject> objects) { inflater = LayoutInflater.from(context); this.objects = objects; } public int getCount() { return objects.size(); } public CustomObject getItem(int position) { return objects.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.your_view_layout, null); holder.textView1 = (TextView) convertView.findViewById(R.id.id_textView1); holder.textView2 = (TextView) convertView.findViewById(R.id.list_id_textView2); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView1.setText(objects.get(position).getprop1()); holder.textView2.setText(objects.get(position).getprop2()); return convertView; } } 

Ahora puede definir y configurar el adaptador en su actividad:

 ArrayList<CustomObject> objects = new ArrayList<CustomObject>(); CustomAdapter customAdapter = new CustomAdapter(this, objects); listView.setAdapter(customAdapter); 

Ahora solo tienes que administrar tu CustomObject en la lista de objetos. No olvide invocar customAdapter.notifyDataSetChanged() cuando desee modificar las repercusiones en ListView.

Su código getView () debe ir a una clase que extienda BaseAdapter o una de sus subclases.

Una forma de hacerlo es crear una clase privada dentro de su MyDashboardActivity. Aquí hay un ejemplo rápido a continuación (se requerirá algún código adicional). Probablemente también desee que un objeto personalizado asocie todas las cosas que desea mostrar en un elemento de lista. En lugar de matrices múltiples, tiene una matriz de un tipo personalizado que tiene propiedades para cada valor que está rastreando.

Una cosa más: sus cuatro TextViews deben ir a su propio archivo de diseño (véase list_item.xml aquí ). Ese archivo de disposición de elementos se engancha a través del constructor del adaptador personalizado (he añadido un comentario en el código de abajo para resaltar esto).

 protected CustomAdapter mAdapter; public class MyDashboardActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mydashboard); final LayoutInflater mInflater = LayoutInflater.from(this); mListView = (ListView)findViewById(R.id.dashboardList); mAdapter = new CustomAdapter(this, <array to be adapted>); mListView.setAdapter(mAdapter); } private class CustomAdapter extends ArrayAdapter<String> { protected Context mContext; protected ArrayList<String> mItems; public CustomAdapter(Context context, ArrayList<String> items) { super(context, R.layout.custom_list_item, items); // Use a custom layout file mContext = context; mItems = items; } public View getView(int position, View convertView, ViewGroup parent) { System.out.println("enters"); if(convertView == null){ convertView = LayoutInflater.from(this).inflate(R.layout.mydashboard,null); } // You'll need to use the mItems array to populate these... ((TextView) convertView.findViewById(R.id.project)).setText(project[position]); ((TextView) convertView.findViewById(R.id.work_request)).setText(workRequests[position]); ((TextView) convertView.findViewById(R.id.start_date)).setText(startDate[position]); ((TextView) convertView.findViewById(R.id.status)).setText(status[position]); return convertView; } } } 

Hay algunas maneras de hacer esto. Te mostraré mi camino que contiene dos diseños, siendo el primero el ListView su auto y el otro es cómo el texto debe aparecer por elemento de lista.

Listset.xml

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

Listitems.xml (También puedes poner imágenes aquí, la idea aquí es control)

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <TextView android:id="@+id/makerID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textSize="25dp"/> </LinearLayout> 

Con lo anterior no tengo la obra de arte todavía, pero tengo la intención de añadir un ImageView para los iconos (y se puede agregar más TextViews también). Esta es mi clase de adaptador personalizada.

ListAdapter.java

 class ListAdapter extends ArrayAdapter <String> { public ListAdapter(Context context, String[] values) { super(context, R.layout.listitems, values); //set the layout that contains your views (not the one with the ListView) } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(getContext()); View view = inflater.inflate(R.layout.listitems, parent, false); //same here. String text = getItem(position); TextView makerID = (TextView) view.findViewById(R.id.makerID); makerID.setText(text); return view; } } 

En tu archivo de actividad principal

 setContentView (R.layout.listset); 

Y agrega esto debajo en los mismos corchetes que setContentView ()

 ListAdapter adapter = new ListAdapter(this, MyString[]); //place your String array in place of MyString ListView lv = (ListView) findViewById(R.id.ListViewID); //the ID you set your ListView to. lv.setAdapter(adapter); 

Editar

Estoy un poco tarde para la fiesta parece, pero tal vez esto ayudará a alguien.

  • Cómo establecer la altura de filas ListView
  • ¿Cómo puedo obtener un elemento ListView para ser elevado?
  • Cómo cambiar el enfoque del siguiente elemento de la lista automáticamente
  • SearchView en ActionBar - problemas con el botón * Up *
  • Listview con inflación de diseño diferente para cada fila
  • Android: Cómo rellenar un ListView con el indexador de alfabeto y fastscroll como en la aplicación de contactos.
  • Agregando Viewpager como un encabezado a un listView
  • ListView resaltado superior en el desplazamiento
  • Haga clic en un elemento de la lista RecyclerView
  • Custom SimpleCursorAdapter, consulta de base de datos y NullPointerException
  • Cómo actualizar Youtube Player View onItemClickListener () en un ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.