2010-01-21 16 views
17

Czy ktoś może podać mi przykład na dwóch liniach?czy ktoś może podać mi przykład Two_line_list_item w systemie Android?

+0

[tutaj] (http: //mylifewithandroid.blogspot. com/2008/03/my-first-meeting-with-simpleadapter.html) możesz znaleźć przykład. Ten styl zawiera element z dwoma wierszami tekstu, prawdopodobnie z innym formatowaniem. –

+0

To nie jest widok TwoLineListItem, ten samouczek używa prostego ListView. – mudit

Odpowiedz

37

Jeszcze nie znalazłem przykładu, który faktycznie używa wbudowanego układu, android.R.layout.two_line_list_item i ListView zamiast ListActivity. Więc idzie.

Jeśli się spieszysz, poniższe zastąpienie TwoLineArrayAdapter.getView() jest ważną częścią korzystania z domyślnego układu two_line_list_item.

Dane

Masz klasę, która określa elementy listy. Zakładam, że masz ich wiele.

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

Streszczenie TwoLineArrayAdapter

Ta klasa abstrakcyjna mogą być ponownie wykorzystane, i sprawia, że ​​zdefiniowanie dwuwierszowy ListView dużo łatwiej później. Możesz można dostarczyć swój własny układ, ale konstruktor dwóch argumentów używa wbudowanego układu two_line_list_item. Jedynym wymaganiem dotyczącym niestandardowych układów elementów listy jest to, że muszą one używać @android:id/text1 i @android:id/text2 do identyfikowania swoich dzieci TextView, tak jak robi to .

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

Konkretny TwoLineArrayAdapter

Wreszcie, oto kod piszesz specyficzne dla danej klasy Employee tak, że będzie to uczynić w 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()

W onCreate() metody swoją aktywność użytkownika, masz kod, który wygląda tak:

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

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

niesamowita odpowiedź, dzięki. Mogę zasugerować dodatkowo implementację getDropDownView (int position, View convertView, ViewGroup parent), aby wyglądał poprawnie w tym kontekście. Twoja implementacja może po prostu być: return getView (...) – Keith

Powiązane problemy