2013-07-10 4 views
4

Есть ли хороший учебник или ссылка, которая показывает, как добавлять разные элементы в список?
Например, один с двумя Текстовые строки и Флажок, другой, который вы только что нажали, и что-то появится. Все, что у меня есть сейчас, - это каждый элемент списка, это одно и то же двухстрочное текстовое представление и флажок ...
Или, если есть способ добавить 1 строку за раз с другой компоновкой через R.layout.xxx?Добавление различных типов элементов в виде списка

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

Возможный дубликат [Multiply textviews in listview] (http://stackoverflow.com/questions/17554624/multiply-textviews-in-a-listview) – BC2

+0

Возможный дубликат [Android Listview с разным расположением для каждой строки] (Http: // StackOverflow.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, а второй тип элемента списка имеет только кнопку. Вы можете поместить любые виджеты, которые вам нравятся внутри каждого элемента списка, но я просто сохранил этот пример.

The 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> 
Смежные вопросы