список рассылки Android разные взгляды для каждого элемента - PullRequest
6 голосов
/ 21 декабря 2009

Ниже приведен фрагмент кода, который используется для просмотра элемента списка. Я хочу использовать разные представления для каждой строки 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);
        }
    }

Ответы [ 2 ]

18 голосов
/ 21 декабря 2009

Вам понадобится, как правило, более сложный Adapter. В частности, вам нужно переопределить getViewTypeCount() и getItemViewType(). Вы можете взглянуть на мой SackOfViewsAdapter как способ сделать это для коротких списков или на мой MergeAdapter для смешивания отдельных представлений с результатами запросов к базе данных или веб-сервису .

2 голосов
/ 17 апреля 2014

Я знаю, что на это уже ответили ... но я хотел бы привести более полный пример.

В моем примере действие списка, которое будет отображать наше настраиваемое представление списка, называется OptionsActivity, потому что в моем проекте это действие будет отображать различные параметры, которые мой пользователь может установить для управления моим приложением. Есть два типа элементов списка, один тип элемента списка просто имеет TextView, а второй тип элемента списка просто имеет кнопку. Вы можете поместить любые виджеты, которые вам нравятся, в каждый тип элемента списка, но я сохранил этот пример простым.

Метод 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...