加入不同类型的项目的列表视图的 [英] Adding different types of items a list view

查看:115
本文介绍了加入不同类型的项目的列表视图的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个很好的教程或链接,显示如何不同的项目添加到列表视图?
例如,一拖二的文本行复选框,另外您刚刚preSS和和东西会弹出。所有我现在已经是每一个列表项是相同的两行文本视图和复选框...
,如果通过 R.layout.xxx方式来增加1排在了不同的布局时间

 公开查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
    mRoot = inflater.inflate(R.layout.frag_settings,集装箱,假);
    mItems = getResources()getStringArray(R.array.setting_items)。
    mItemDescription = getResources()getStringArray(R.array.setting_item_descriptions)。

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

ArrayAdapter<字符串> lvRowTitle =新的ArrayAdapter<字符串>(getActivity()
         R.layout.setting_twolinetext_checkbox,R.id.tvRowTitle,
        mItems);

mItemListView.setAdapter(lvRowTitle);


ArrayAdapter<字符串> lvRowDesc =新的ArrayAdapter<字符串>(getActivity()
        R.layout.setting_twolinetext_checkbox,R.id.tvRowDesc,
        mItemDescription);


   mItemListView.setAdapter(lvRowDesc);


返回mRoot;
 

解决方案

在我的例子中,列表的活动,将展示我们的自定义列表视图称为OptionsActivity,因为在我的项目本次活动将会显示不同的选择我的用户可以设置来控制我的应用程序。有两个列表项的类型,一个列表项类型只是有一个TextView和第二个列表项类型只是有一个按钮。你可以把任何你喜欢的每个项目类型里面的小部件,但我一直在这个例子中的简单。

getItemView 的方法检查,看看哪些列表项应该是1型还是2。根据我的定义我往上顶,前5个列表项将列表项的类型1的静态整数,和过去5列表项目将列表项的类型2.所以,如果你编译并运行它,你将有一个ListView具有该只包含一个按钮,只包含一个TextView五个项目,然后五个项目。

下面是活动code中,活动xml文件,并为每个列表项类型的XML文件。

OptionsActivity.java:

 公共类OptionsActivity扩展ListActivity {

    私有静态最终诠释LIST_ITEM_TYPE_1 = 0;
    私有静态最终诠释LIST_ITEM_TYPE_2 = 1;
    私有静态最终诠释LIST_ITEM_TYPE_COUNT = 2;

    私有静态最终诠释LIST_ITEM_COUNT = 10;
    //前五个列表项将列表项类型1
    //最后五会列表项的类型2
    私有静态最终诠释LIST_ITEM_TYPE_1_COUNT = 5;

    私人MyCustomAdapter mAdapter;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        mAdapter =新MyCustomAdapter();
        的for(int i = 0; I< LIST_ITEM_COUNT;我++){
          如果(ⅰ&其中; LIST_ITEM_TYPE_1_COUNT)
            mAdapter.addItem(项类型1);
          其他
            mAdapter.addItem(项目型);
        }
        setListAdapter(mAdapter);
    }

    私有类MyCustomAdapter扩展了BaseAdapter {

        私人的ArrayList<字符串> MDATA =新的ArrayList<字符串>();
        私人LayoutInflater mInflater;

        公共MyCustomAdapter(){
            mInflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        公共无效的addItem(最后弦乐项目){
            mData.add(项目);
            notifyDataSetChanged();
        }

        @覆盖
        公众诠释getItemViewType(INT位置){
          如果(位置< LIST_ITEM_TYPE_1_COUNT)
              返回LIST_ITEM_TYPE_1;
          其他
              返回LIST_ITEM_TYPE_2;
        }

        @覆盖
        公众诠释getViewTypeCount(){
            返回LIST_ITEM_TYPE_COUNT;
        }

        @覆盖
        公众诠释getCount将(){
            返回mData.size();
        }

        @覆盖
        公共字符串的getItem(INT位置){
            返回mData.get(位置);
        }

        @覆盖
        众长getItemId(INT位置){
            返回的位置;
        }

        @覆盖
        公共查看getView(INT位置,查看convertView,ViewGroup中父){
            ViewHolder支架=无效;
            整型= getItemViewType(位置);
            如果(convertView == NULL){
                持有人=新ViewHolder();
                开关(类型){
                    案例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);
                        打破;
                    案例LIST_ITEM_TYPE_2:
                        convertView = mInflater.inflate(R.layout.list_item_type2,NULL);
                        holder.textView =(TextView中)convertView.findViewById(R.id.list_item_type2_button);
                        打破;
                }
                convertView.setTag(保持器);
            } 其他 {
                支架=(ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(位置));
            返回convertView;
        }

    }

    公共静态类ViewHolder {
        公众的TextView TextView的;
    }

}
 

activity_options.xml:

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人:ID =@ + ID /容器
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直
     >

    <的ListView
        机器人:ID =@ + ID / optionsList
        机器人:layout_width =match_parent
        机器人:layout_height =WRAP_CONTENT>
    < / ListView控件>

< / LinearLayout中>
 

list_item_type_1.xml:

 < XML版本=1.0编码=UTF-8&GT?;
<的LinearLayout
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / list_item_type1_layout
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直>

    <的TextView
        机器人:ID =@ + ID / list_item_type1_text_view
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=文本到这里/>

< / LinearLayout中>
 

list_item_type2.xml:

 < XML版本=1.0编码=UTF-8&GT?;
<的LinearLayout
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / list_item_type2_layout
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直>

    <按钮
        机器人:ID =@ + ID / list_item_type2_button
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:文本=按钮文字放在这里/>

< / LinearLayout中>
 

Is there a good tutorial or link that shows how to add different items to a listview?
For example, one with two Text lines and a Check box, another that you just press and and something would pop up. All I have now is every list item is the same two line text view and checkbox...
Or, if there is a way to add 1 row at a time with a different layout through 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;

解决方案

In my example, the list activity that will display our custom list view is called OptionsActivity, because in my project this activity is going to display the different options my user can set to control my app. There are two list item types, one list item type just has a TextView and the second list item type just has a Button. You can put any widgets you like inside each list item type, but I kept this example simple.

The getItemView method checks to see which list items should be type 1 or type 2. According to my static ints I defined up top, the first 5 list items will be list item type 1, and the last 5 list items will be list item type 2. So if you compile and run this, you will have a ListView that has five items that just contain a button, and then five items that just contain a TextView.

Below is the activity code, the activity xml file, and an xml file for each list item type.

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>

这篇关于加入不同类型的项目的列表视图的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆