2013-07-10 31 views
4

是否有一個很好的教程或鏈接,顯示如何將不同的項目添加到列表視圖?
例如,一個有兩個文本行和一個複選框,另一個,你只需按下,並且會彈出一些。我現在擁有的所有列表項都是相同的兩行文本視圖和複選框...
,如果有一種方法可以通過R.layout.xxx以不同的佈局一次添加1行?添加不同類型的項目列表視圖

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mRoot = inflater.inflate(R.layout.frag_settings, container, false); 
    mItems = getResources().getStringArray(R.array.setting_items); 
    mItemDescription = getResources().getStringArray(R.array.setting_item_descriptions); 

mItemListView = (ListView) mRoot.findViewById(R.id.lvMainListView); 

ArrayAdapter<String> lvRowTitle = new ArrayAdapter<String>(getActivity(), 
     R.layout.setting_twolinetext_checkbox, R.id.tvRowTitle, 
     mItems); 

mItemListView.setAdapter(lvRowTitle); 


ArrayAdapter<String> lvRowDesc = new ArrayAdapter<String>(getActivity(), 
     R.layout.setting_twolinetext_checkbox, R.id.tvRowDesc, 
     mItemDescription); 


    mItemListView.setAdapter(lvRowDesc); 


return mRoot; 
+0

[在列表視圖中乘以textviews](http://stackoverflow.com/questions/17554624/multiply-textviews-in-a-listview) – BC2

+0

[Android列表視圖的每行不同佈局]的可能重複( HTTP://計算器。com/questions/4777272/android-listview-with-different-layout-for-each-row) – Varun

+0

https://code.facebook.com/posts/879498888759525/fast-rendering-news-feed-on-android/ –

回答

1

您應該創建自己的課程BaseAdapter。我建議您觀看The World of ListView,它將幫助您瞭解有關使用ListView所需的一切。

2

你有兩種可能做到這一點:

  • 創建一個類型,並檢查您的類型並返回有關此類型的視圖。
  • BaseAdapter有兩種方法檢查其中的不同項目,getItemViewType(int position)getViewTypeCount()。在那裏做你的東西。

檢查本教程:

ListView with multiple rows

4

在我的例子中,列表的活動,將展示我們的自定義列表視圖稱爲OptionsActivity,因爲在我的項目本次活動將會顯示不同的選項我的用戶可以設置來控制我的應用程序。有兩個列表項類型,一個列表項類型只是一個TextView,第二個列表項類型只有一個Button。你可以在每個列表項類型中放入你喜歡的任何小部件,但是我保持這個例子簡單。

getItemView方法檢查,看看哪些列表項應爲1型或2型。根據我定義了頂部,前5個列表項將列表項鍵入1,在過去的5名單我的靜態整型項目將是列表項目類型2.因此,如果您編譯並運行此項目,您將擁有一個ListView,其中有五個項目只包含一個按鈕,然後是五個包含TextView的項目。

下面是每個列表項類型的活動代碼,活動xml文件和xml文件。

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> 
相關問題