android 嵌套 listview

来源:互联网 发布:js 百分比 编辑:程序博客网 时间:2024/05/21 19:23

android 嵌套 listview

基本效果如下:
这里写图片描述
listview元素 A:0 B:1 C:2 …
每个listview 元素内对应的子listview元素
A:0 对应子元素集合 A:0:0 A:0:1 A:0:2 A:0:3 A:0:4
B:1 对应子元素集合 B:1:0 B:1:1 B:1:2 B:1:3 B:1:4
C:2 …..

这里需要使用继承 BaseAdapter,重写 listview 加载数据所需的接口,并在函数
public View getView(int postion, View convertView, ViewGroup parent) 内创建 listview加载的每个元素 convertView。 我们只需要创建一个 listview,并把此作为convertView的一个子元素,即可。


  1. 创建主listview 类
    public class MyAdapter extends BaseAdapter{        private ArrayList<String> listdata;        private LayoutInflater inflater;        private Context context;        public MyAdapter(Context c,ArrayList<String> listdata){            this.listdata = listdata;            this.inflater = LayoutInflater.from(c);             context = c;        }        @Override        public int getCount() {            return listdata.size();        }        @Override        public Object getItem(int arg0) {            return listdata.get(arg0);        }               public long getItemId(int arg0) {            return 0;        }        ///主listview元素,其中存在两个元素,一个 textview,一个子listview        public final class  MyitemObj{           public TextView text;           public ListView lv;        }        @Override        public View getView(int postion, View convertView, ViewGroup parent) {         ///缓存主listview中item( textview 和 子listview)            MyitemObj myitemObj = null;              if(convertView == null){                 convertView =  this.inflater.inflate(R.layout.myitem, null);                   myitemObj = new MyitemObj();                 myitemObj.text = (TextView) convertView.findViewById(R.id.lvtv);                 myitemObj.lv = (ListView) convertView.findViewById(R.id.lvitemmain);                 convertView.setTag(myitemObj);             }else {                myitemObj = (MyitemObj)convertView.getTag();        /// 设置主listview元素中当前item 的 textview数据            myitemObj.text.setText( listdata.get(postion) +":"+ Integer.valueOf(postion) );            ArrayList<String> itemdatas = new ArrayList<String>();            for(int i=0;i<5;i++){                itemdatas.add( listdata.get(postion) +":"+ Integer.valueOf(postion) + ":"+ Integer.valueOf(i) );            }            ///设置 主listview元素中当前item 的 listview(子listview) 数据            myitemObj.lv.setAdapter(new MyAdapterOfItemItem(this.context, itemdatas));            ///重新计算listview高度,否则,主listview中每个item的子listview无法正常显示,来源于网络.....            setListViewHeightBasedOnChildren(myitemObj.lv);            return convertView;        }    }

2.创建listview的 item中listview 对应的类
这个类比较正常

public class MyAdapterOfItemItem extends BaseAdapter{        private ArrayList<String> listdata;        private LayoutInflater inflater;        public MyAdapterOfItemItem(Context context,ArrayList<String> listdata){            this.listdata = listdata;            this.inflater = LayoutInflater.from(context);         }        @Override        public int getCount() {            return listdata.size();        }        @Override        public Object getItem(int arg0) {        // TODO Auto-generated method stub        return listdata.get(arg0);        }               public long getItemId(int arg0) {            return 0;        }        //// 和上同,当前listview 中的两个元素,一个 textview ,一个image        public final class  MyitemObj{           public TextView text;           public ImageView image;        }        @Override        public View getView(int postion, View convertView, ViewGroup parent) {            MyitemObj myitemObj;            if(convertView == null){                 convertView =  this.inflater.inflate(R.layout.myitemitem, null);                   myitemObj = new MyitemObj();                 myitemObj.text = (TextView) convertView.findViewById(R.id.itemitemtv);                 myitemObj.image = (ImageView) convertView.findViewById(R.id.itemitemimage);                 convertView.setTag(myitemObj);             }else {                myitemObj = (MyitemObj)convertView.getTag();            }            myitemObj.text.setText(listdata.get(postion));            myitemObj.image.setImageResource(R.drawable.ic_launcher);            return convertView;        }    }

3.Active 类

    public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ListView lv = (ListView)findViewById(R.id.lvmain);        ArrayList<String> listdata = new ArrayList<String>();         listdata.add("A");         listdata.add("B");         listdata.add("C");        lv.setAdapter(new MyAdapter(this, listdata));    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }  /// 重新计算listview高度    public static void setListViewHeightBasedOnChildren(ListView listView) {          ListAdapter listAdapter = listView.getAdapter();           if (listAdapter == null) {            return;          }        int totalHeight = 0;          for (int i = 0; i < listAdapter.getCount(); i++) {              View listItem = listAdapter.getView(i, null, listView);              listItem.measure(0, 0);              totalHeight += listItem.getMeasuredHeight();          }        ViewGroup.LayoutParams params = listView.getLayoutParams();          params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));          listView.setLayoutParams(params);      } }

4 UI activity_main.xml

 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:paddingLeft="10dip"      android:id="@+id/main"    android:paddingRight="10dip"    android:orientation="vertical">     <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />        <ListView         android:id="@+id/lvmain"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/outline"        /></LinearLayout>

5 myitem.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/itemlinelayout"    android:orientation="vertical" >    <TextView        android:id="@+id/lvtv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:singleLine="false" />    <ListView         android:id="@+id/lvitemmain"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/outline"        /></LinearLayout>

6 myitemitem.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:id="@+id/itemitemlinelayout"    android:orientation="horizontal" >            <TextView            android:id="@+id/itemitemtv"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:singleLine="false" />            <ImageView            android:id="@+id/itemitemimage"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:singleLine="false" /></LinearLayout>
0 0
原创粉丝点击