2009-12-21 13 views
6

Aşağıda, liste öğesi için görünüm almak için kullanılan kod parçası yer almaktadır. listview'un her satırı için farklı görünüm kullanmak istiyorum, nasıl yapabilirim? İyi dersler var mı?android list her öğenin farklı görünümlerini görüntüler

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

cevap

18

Genelde daha karmaşık bir Adapter'a gereksiniminiz olacaktır. Özellikle, getViewTypeCount() ve getItemViewType()'u geçersiz kılmanız gerekir. Kısa listeler için bunu SackOfViewsAdapter adresime veya veritabanı veya Web hizmeti sorgularının sonuçlarıyla tek tek görünümleri birleştirmek için MergeAdapter'a bakabilirsiniz.

2

Bunun daha önce yanıtlandığını biliyorum ... ama daha eksiksiz bir örnek vermek istedim.

Örneğimde, özel liste görünümümüzü gösterecek liste etkinliğine OptionsActivity adı verilir çünkü projemde bu etkinlik, kullanıcının uygulamamı denetlemek üzere ayarlayabileceği farklı seçenekleri gösterecektir. İki liste öğesi türü vardır, bir liste öğesi türü sadece bir TextView'a ve ikinci liste öğesi türünde sadece bir Düğme vardır. Her liste öğesi türünde istediğiniz herhangi bir widget'ı koyabilirsiniz, ancak bu örneği basit tuttum.

getItemView yöntem kontrolleri

liste öğeleri olmalıdır görmek için ben, ilk 5 listesi öğeleri liste öğesi tip 1 ve son 5 liste olacak kontör tanımlanan benim statik ints göre tip 1 veya tip 2 Öğeler, öğe öğesi 2 olacaktır. Bu nedenle, derleyip çalıştırırsanız, bir düğmeyi içeren beş öğeye sahip bir Liste Görünümü'nü ve ardından bir TextView içeren beş öğenin olacaktır.

Her liste öğesi türü için aktivite kodu, etkinlik xml dosyası ve bir xml dosyası aşağıdadır.

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> 
İlgili konular