¿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:
- Encabezados ListView sin separadores de elementos de lista
- ListView no dispara setOnLongClickListener, sólo setOnItemClickListener
- HorizontalListview con imagen seleccionar y unselect
- Android ListView no resaltará la fila seleccionada
- Cómo obtener datos de adaptador personalizado en ListView?
<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!
- Cómo crear android listview como android google cromo pestaña
- ¿Por qué no "notifyDatasetChanged ()" notifica todos los elementos visibles?
- Imágenes de carga lenta en ListView en Android
- ¿Por qué ListView y RecyclerView son focusableInTouchMode?
- ¿Cómo desplazar ListView a la parte inferior?
- Agregar elemento al final listview android
- Filtro de vista de lista Android
- El elemento ListView no extenderá el ancho a fill_parent
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.
- Expectativa del puntero nulo de UpdateAppWidget
- Conversión de fecha y hora simple de Java a la fecha