2009-12-21 5 views
6

Ci-dessous est le morceau de code qui est utilisé pour obtenir l'affichage de l'élément de la liste. Je veux utiliser une vue différente pour chaque ligne de listview, comment puis-je le faire? De bons tutoriels?android listview différentes vues pour chaque article

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

Répondre

18

Vous aurez besoin d'un Adapter généralement plus compliqué. En particulier, vous devez remplacer getViewTypeCount() et getItemViewType(). Vous pouvez jeter un oeil à mon SackOfViewsAdapter comme un moyen de le faire pour les listes courtes, ou mon MergeAdapter pour mélanger les vues individuelles avec les résultats de la base de données ou des requêtes de service Web.

2

Je sais que cela a déjà été répondu ... mais je voulais donner un exemple plus complet. Dans mon exemple, l'activité de liste qui affichera notre vue de liste personnalisée est appelée OptionsActivity, car dans mon projet cette activité va afficher les différentes options que mon utilisateur peut définir pour contrôler mon application. Il y a deux types d'éléments de liste, un type d'élément de liste a juste un TextView et le second type d'élément de liste a juste un bouton. Vous pouvez placer tous les widgets que vous voulez dans chaque type d'élément de liste, mais j'ai gardé cet exemple simple.

Les getItemView méthode vérifie pour voir quels éléments de la liste doivent être de type 1 ou de type 2. Selon mes ints statiques I définis en haut, les 5 premiers éléments de la liste seront liste type d'élément 1, et la dernière liste 5 Les éléments seront list item type 2. Donc si vous compilez et exécutez ceci, vous aurez un ListView qui a cinq éléments qui contiennent juste un bouton, et cinq items qui contiennent juste un TextView. Vous trouverez ci-dessous le code d'activité, le fichier xml d'activité et un fichier xml pour chaque type d'élément de liste ci-dessous:

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> 
Questions connexes