【问题标题】:android listview different views for every itemandroid listview 每个项目的不同视图
【发布时间】:2009-12-21 12:14:09
【问题描述】:

以下是用于获取列表项视图的代码。 我想为listview 的每一行使用不同的视图,我该怎么做?有什么好的教程吗?

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

【问题讨论】:

    标签: android listview


    【解决方案1】:

    您将需要一个通常更复杂的Adapter。特别是,您需要覆盖getViewTypeCount()getItemViewType()。您可以查看我的SackOfViewsAdapter 来获取短列表,或者查看MergeAdapter 来将单个视图与数据库或 Web 服务查询的结果混合。

    【讨论】:

      【解决方案2】:

      我知道这已经被回答了......但我想举一个更完整的例子。

      在我的示例中,将显示我们的自定义列表视图的列表活动称为 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        • 1970-01-01
        • 2014-01-22
        • 2015-02-05
        • 1970-01-01
        相关资源
        最近更新 更多