2010-01-21 24 views
17

¿Alguien me puede dar el ejemplo two_line_list_item?¿alguien me puede dar un ejemplo de Two_line_list_item en Android?

+0

[aquí] (http: //mylifewithandroid.blogspot. com/2008/03/my-first-meeting-with-simpleadapter.html) puede encontrar un ejemplo. Este estilo le proporciona un elemento con dos filas de texto, posiblemente con un formato diferente. –

+0

No es una vista de TwoLineListItem, este tutorial usa Simple ListView. – mudit

Respuesta

37

Todavía tengo que encontrar un ejemplo que realmente utiliza el diseño incorporado, android.R.layout.two_line_list_item y ListView insted de ListActivity. Así que aquí va.

Si tiene prisa, la anulación de TwoLineArrayAdapter.getView() a continuación es la parte importante del uso del diseño predeterminado two_line_list_item.

Sus datos

tiene una clase que define los elementos de lista. Asumiré que tienes una variedad de estos.

public class Employee { 
    public String name; 
    public String title; 
} 

Un TwoLineArrayAdapter abstracta

Esta clase abstracta puede ser reutilizado, y hace que la definición de una de dos líneas ListView mucho más fácil después. Usted puede proporcionar su propio diseño, pero el constructor de dos argumentos utiliza el diseño incorporado two_line_list_item. El único requisito para los diseños de elementos de lista personalizados es que deben usar @android:id/text1 y @android:id/text2 para identificar sus hijos TextView, al igual que two_line_list_item.

public abstract class TwoLineArrayAdapter<T> extends ArrayAdapter<T> { 
     private int mListItemLayoutResId; 

     public TwoLineArrayAdapter(Context context, T[] ts) { 
      this(context, android.R.layout.two_line_list_item, ts); 
     } 

     public TwoLineArrayAdapter(
       Context context, 
       int listItemLayoutResourceId, 
       T[] ts) { 
      super(context, listItemLayoutResourceId, ts); 
      mListItemLayoutResId = listItemLayoutResourceId; 
     } 

     @Override 
     public android.view.View getView(
       int position, 
       View convertView, 
       ViewGroup parent) { 


      LayoutInflater inflater = (LayoutInflater)getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View listItemView = convertView; 
      if (null == convertView) { 
       listItemView = inflater.inflate(
        mListItemLayoutResId, 
        parent, 
        false); 
      } 

      // The ListItemLayout must use the standard text item IDs. 
      TextView lineOneView = (TextView)listItemView.findViewById(
       android.R.id.text1); 
      TextView lineTwoView = (TextView)listItemView.findViewById(
       android.R.id.text2); 

      T t = (T)getItem(position); 
      lineOneView.setText(lineOneText(t)); 
      lineTwoView.setText(lineTwoText(t)); 

      return listItemView; 
     } 

     public abstract String lineOneText(T t); 

     public abstract String lineTwoText(T t); 
} 

Un TwoLineArrayAdapter concreto

Por último, aquí está el código que escriba específica de su clase Employee por lo que va a render en su ListView.

public class EmployeeArrayAdapter extends TwoLineArrayAdapter<Employee> { 
    public EmployeeArrayAdapter(Context context, Employee[] employees) { 
     super(context, employees); 
    } 

    @Override 
    public String lineOneText(Employee e) { 
     return e.name; 
    } 

    @Override 
    public String lineTwoText(Employee e) { 
     return e.title; 
    } 
} 

Activity.onCreate()

En el método de su actividad onCreate(), tendrá código que se parece a esto:

employees = new Employee[...]; 
    //...populate the employee array... 

    employeeLV = (ListView)findViewById(R.id.employee_list); 
    employeeLV.setAdapter(new EmployeeArrayAdapter(this, employees); 
+0

respuesta increíble, gracias. ¿Podría sugerir la implementación de getDropDownView (int position, View convertView, ViewGroup parent) para que aparezca correctamente en ese contexto? Su implementación puede ser simplemente: return getView (...) – Keith

Cuestiones relacionadas