5

是否有一个很好的教程或链接显示如何将不同的项目添加到列表视图?
例如,一个有两个Text 行和一个Check box,另一个你只需按下它就会弹出一些东西。我现在所拥有的是每个列表项都是相同的两行文本视图和复选框......
或者,如果有一种方法可以一次添加 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;
4

4 回答 4

5

在我的示例中,将显示我们的自定义列表视图的列表活动称为 OptionsActivity,因为在我的项目中,此活动将显示我的用户可以设置来控制我的应用程序的不同选项。有两种列表项类型,一种列表项类型只有一个 TextView,第二种列表项类型只有一个 Button。您可以在每个列表项类型中放置您喜欢的任何小部件,但我让这个示例保持简单。

getItemView方法检查哪些列表项应该是类型 1 或类型 2。根据我在顶部定义的静态整数,前 5 个列表项将是列表项类型 1,最后 5 个列表项将是列表项类型2. 因此,如果您编译并运行它,您将拥有一个 ListView,其中包含五个仅包含一个按钮的项目,然后是五个仅包含一个 TextView 的项目。

下面是活动代码、活动 xml 文件和每个列表项类型的 xml 文件。

选项活动.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;
    }

}

活动选项.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>
于 2014-04-17T06:08:17.973 回答
3

你有两种可能性来做到这一点:

  • 创建一个 Type 并检查您的类型并返回与此类型相关的视图。
  • BaseAdapter有两种方法可以检查其中的不同项目,getItemViewType(int position)并且getViewTypeCount(). 在那里做你的事情。

检查本教程:

具有多行的 ListView

于 2013-07-10T15:21:45.047 回答
1

您应该创建自己的类扩展BaseAdapter. 我推荐观看ListView 的世界,它将帮助您了解使用 ListView 需要了解的一切。

于 2013-07-10T15:15:36.017 回答
0

除了@LouMorda 答案,我会使用一些类,其中包含有关项目和列表项目类型的信息的字段:

public class Item {
  private int itemViewType;
      private Object tag;
      private String title;

      public Item(int itemViewType){
          this.itemViewType = itemViewType;
      }

      public int getItemViewType() {
          return itemViewType;
      }

      public void setItemViewType(int itemViewType) {
          this.itemViewType = itemViewType;
      }
      ...
 }

因此,在以不同顺序将项目添加到列表时,使用此对象提供了更大的灵活性:

public class OptionsActivity extends ListActivity {

private static final int LIST_ITEM_TYPE_1 = 0;
private static final int LIST_ITEM_TYPE_2 = 1;
private ArrayList<String> mItemsSource = new ArrayList<>();


 ...
    @Override
    public int getItemViewType(int position) {
      return  mItemsSource.get(position).getItemViewType();
    }
    ...
}
于 2018-04-27T09:40:31.417 回答