2009-12-21 20 views
6

Poniżej znajduje się fragment kodu, który służy do wyświetlenia elementu listy. Chcę użyć innego widoku dla każdego wiersza listview, jak mogę to zrobić? Jakieś dobre tutoriale?lista androidów różne widoki dla każdego elementu

public View getView(int position, View convertView, 
       ViewGroup parent) { 
      View row=convertView; 
      ResultWrapper wrapper; 

      if (row==null) {   
       LayoutInflater inflater=getLayoutInflater(); 
       row=inflater.inflate(R.layout.result_row, null); 
       wrapper=new ResultWrapper(row); 
       row.setTag(wrapper); 
      } 
      else { 
       wrapper=(ResultWrapper)row.getTag(); 
      } 
      wrapper.populateFrom(model.get(position)); 
      wraperList.add(wrapper); 
      return(row); 
     } 
    } 

Odpowiedz

18

Będziesz potrzebować bardziej skomplikowanego Adapter. W szczególności musisz zastąpić getViewTypeCount() i getItemViewType(). Możesz spojrzeć na mój jako sposób wykonania tego dla krótkich list lub mojego MergeAdapter do mieszania pojedynczych widoków z wynikami zapytań bazy danych lub usług sieci Web.

2

Wiem, że odpowiedź została już udzielona ... ale chciałem podać bardziej kompletny przykład.

W moim przykładzie aktywność listy, która wyświetli nasz niestandardowy widok listy, nazywa się OptionsActivity, ponieważ w moim projekcie to działanie wyświetli różne opcje, które mój użytkownik może ustawić, by kontrolować moją aplikację. Istnieją dwa typy elementów listy, jeden typ elementu listy ma tylko widok tekstu, a drugi typ elementu listy ma tylko przycisk. Możesz umieścić dowolne widżety w każdym typie listy, ale ten przykład był prosty.

Metoda getItemView sprawdza, które elementy listy powinny być typu 1 lub 2. Zgodnie z moimi statycznymi adresami zdefiniowanymi na górze, pierwsze 5 pozycji listy będzie typem listy 1, a ostatnią 5 listą elementy będą typem pozycji listy 2. Jeśli więc skompilujesz i uruchomisz to, będziesz miał ListView, który ma pięć elementów, które zawierają tylko przycisk, a następnie pięć elementów, które zawierają tylko TextView.

Poniżej znajduje się kod aktywności, plik aktywności xml i plik xml dla każdego typu elementu listy.

OptionsActivity.java:

public class OptionsActivity extends ListActivity { 

    private static final int LIST_ITEM_TYPE_1 = 0; 
    private static final int LIST_ITEM_TYPE_2 = 1; 
    private static final int LIST_ITEM_TYPE_COUNT = 2; 

    private static final int LIST_ITEM_COUNT = 10; 
    // The first five list items will be list item type 1 
    // and the last five will be list item type 2 
    private static final int LIST_ITEM_TYPE_1_COUNT = 5; 

    private MyCustomAdapter mAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mAdapter = new MyCustomAdapter(); 
     for (int i = 0; i < LIST_ITEM_COUNT; i++) { 
      if (i < LIST_ITEM_TYPE_1_COUNT) 
      mAdapter.addItem("item type 1"); 
      else 
      mAdapter.addItem("item type 2"); 
     } 
     setListAdapter(mAdapter); 
    } 

    private class MyCustomAdapter extends BaseAdapter { 

     private ArrayList<String> mData = new ArrayList<String>(); 
     private LayoutInflater mInflater; 

     public MyCustomAdapter() { 
      mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     public void addItem(final String item) { 
      mData.add(item); 
      notifyDataSetChanged(); 
     } 

     @Override 
     public int getItemViewType(int position) { 
      if(position < LIST_ITEM_TYPE_1_COUNT) 
       return LIST_ITEM_TYPE_1; 
      else 
       return LIST_ITEM_TYPE_2; 
     } 

     @Override 
     public int getViewTypeCount() { 
      return LIST_ITEM_TYPE_COUNT; 
     } 

     @Override 
     public int getCount() { 
      return mData.size(); 
     } 

     @Override 
     public String getItem(int position) { 
      return mData.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder = null; 
      int type = getItemViewType(position); 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       switch(type) { 
        case LIST_ITEM_TYPE_1: 
         convertView = mInflater.inflate(R.layout.list_item_type1, null); 
         holder.textView = (TextView)convertView.findViewById(R.id.list_item_type1_text_view); 
         break; 
        case LIST_ITEM_TYPE_2: 
         convertView = mInflater.inflate(R.layout.list_item_type2, null); 
         holder.textView = (TextView)convertView.findViewById(R.id.list_item_type2_button); 
         break; 
       } 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder)convertView.getTag(); 
      } 
      holder.textView.setText(mData.get(position)); 
      return convertView; 
     } 

    } 

    public static class ViewHolder { 
     public TextView textView; 
    } 

} 

activity_options.xml:

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

    <ListView 
     android:id="@+id/optionsList" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 

</LinearLayout> 

list_item_type_1.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item_type1_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/list_item_type1_text_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Text goes here" /> 

</LinearLayout> 

list_item_type2.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_item_type2_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/list_item_type2_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button text goes here" /> 

</LinearLayout> 
Powiązane problemy