2012-06-19 13 views
7

Tengo un número de TextView múltiple por artículo de lista en mi ListView. Aprendí a escribir correctamente el método getView, pero no estoy seguro de que use setAdapter para llamar a ese método.¿Cómo configurar el adaptador en caso de múltiples textviews por lista de lista?

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; 
    } 

Ésta es la disposición 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 varias formas, ninguna de las cuales trabajaban. ¿Podría alguien sugerir cómo configurar el adaptador en este caso? ¡Gracias!

+1

ver este ejemplo completo http://android-example-code.blogspot.in/p/dynamic-custoized-list-view-in-android.html – MAC

+0

falta un código ... ¿dónde está la clase extendiendo baseAdapter? ?? –

+0

¿Es su parte 'getView()' de su clase 'Adaptador'? – slybloty

Respuesta

15

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

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

El objeto que representa una vista (una fila en la Lista):

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 su adaptador en su actividad:

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

Ahora solo tiene que administrar su CustomObject en la lista de objetos. No olvide invocar customAdapter.notifyDataSetChanged() cuando desee realizar modificaciones en el ListView.

+0

Muchas gracias, lo estoy probando. – Harsh

+0

de nada, he corregido algunos errores en mis nombres de variables. – FabiF

+0

¿Debo crear adaptadores personalizados para cada nuevo 'ListView' que creo? (Que tiene múltiples 'TextView's por supuesto) – Harsh

4

Su código getView() tiene que entrar en una clase que amplíe BaseAdapter o una de sus subclases.

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

Una cosa más: sus cuatro TextViews deberían ir a su propio archivo de diseño (consulte list_item.xml here). Ese archivo de diseño de elementos se conecta al constructor del adaptador personalizado (agregué un comentario en el código a continuación 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; 
     } 
    } 
} 
+0

¡Me di cuenta! Gracias :) – Harsh

+2

Eres un tipo salvavidas. Te amo – A23149577

+1

Gracias por esto, lo estoy usando. Pero una pequeña sugerencia: IntelliJ IDEA da una advertencia para "inflar (R.layout.mydashboard, null)", y esta respuesta http://stackoverflow.com/a/24832569/253938 sugiere cambiar eso para "inflar (R.layout) .mydashboard, parent, false) ". Hice eso y IntelliJ dejó de regañarme y todavía funciona. – RenniePet

2

Hay algunas formas de hacerlo. Te mostraré mi camino que contiene dos diseños, el primero es solo el ListView self y el otro es cómo debería aparecer el texto por cada elemento de la 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 se puede poner en imágenes aquí, la idea aquí es el 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 aún la obra pero tengo la intención de agregar un ImageView para los iconos (y también puedes agregar más TextViews). Aquí está mi clase de adaptador personalizado.

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 el archivo principal actividad de establecer

setContentView (R.layout.listset); 

y añadir debajo en mismos soportes como 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

Llego un poco tarde a la fiesta, pero tal vez esto ayude a alguien.

Cuestiones relacionadas