ListView的多条目显示
- 反正我是在很多的应用中见过,还包括我自己动手做过的一个APP中就有这个一个应用,这样的场景很多,比如你要分类显示应用,分为系统应用和用户应用,那么你就可以用这个知识点完成
步骤
我们都知道一般的ListView的使用方法,准备条目,准备数据,加载条目并使用数据,为ListView设置数据适配器,然后就可以了,这个多条目显示大体步骤也是这样,不过在准备条目的时候要准备多条,准备数据时要分类别准备,在使用数据适配器的时候多设置两个方法就OK了,简不简单?O(∩_∩) ,下面我就用实际的代码来说明吧,并且加上满满的注释,让你一看就会用,如果不会用,来我的github吧,(https://github.com/z870684110/Method-of-using-ListView/tree/master)这里有这一部分的详细代码1、当然在XML文件中定义ListView了
<ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent"/>
2、准备数据,这里使用数据封装数据
//数据OK了 //========================================================== ListViewItemDataType data1 = new ListViewItemDataType(); data1.data = "hello"; data1.type = ConstantValue.LEFT; ListViewItemDataType data2 = new ListViewItemDataType(); data2.data = "hello"; data2.type = ConstantValue.RIGHT; ListViewItemDataType data3 = new ListViewItemDataType(); data3.data = "额,还是用中文吧,词穷了~"; data3.type = ConstantValue.LEFT; datas = new ListViewItemDataType[]{ data1, data2,data3 };
3、准备条目XML,用于getView里面的inflate
Left_item,right_item是一样的XML内容<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
4、准备适配器
private class MyAdapter extends BaseAdapter{ //下面这两个方法就是多条目必写方法哦 //============================================= //这个方法看一下源码(Ctrl+鼠标右键),返回的是0,那么我们要多一类,那么很容易想到用另外一个数据代表那个条目,刚刚我们设置的Data中的type就是 //用在这里的 //datas 是我把申请的三个条目的数据对象放到了数组中,为了方便 @Override public int getItemViewType(int position) { return datas[position].type; } //这个方法看一下源码,返回的结果是1,这个代表什么呢,相信聪明的你已经猜到了,对,就是view的类型的个数,那么我们要做的就是 //在返回的结果上加1,当然也可以直接设置条目的类型数,下面采用第二种 @Override public int getViewTypeCount() { return 2; } //============================================ @Override public int getCount() { return datas.length; } //这里你要理解一下什么叫做方法重写,重写的要求是什么,不要以为重写就是方法头全部相同,这种认为是不正确滴(虽然一起我也是这么认为的), //这里就修改了返回值的类型,但是要记住,返回值类型尅进行修改,但是必须是其子类才可以,这样就避免了在获取条目之后还需要强制类型转换 @Override public ListViewItemDataType getItem(int position) { return datas[position]; } //随便写写啦,直接填position @Override public long getItemId(int position) { return position; } //OK终于到重点了,坚持看下去 @Override public View getView(int position, View convertView, ViewGroup parent) { //这里使用ViewHolder和convertView的组合,如果你还是不清楚啥意思,去看我的复习Note02,那里面有详细的解释 ViewHolder viewHolder; //在这里你有没有一个疑问?convertView在多条目的时候是怎么判断为null的?是不是只要有一个条目,那么convertView都不会为null呢? //其实我也有这个疑问,所以带着这个疑问,查看了源码,在注释中这么写(位置在AbsListView->adapter->getView) /** * @param convertView The old view to reuse, if possible. Note: You should check that this view * is non-null and of an appropriate type before using. If it is not possible to convert * this view to display the correct data, this method can create a new view. * Heterogeneous lists can specify their number of view types, so that this View is * always of the right type (see {@link #getViewTypeCount()} and * {@link #getItemViewType(int)}). */ //还是没有解决问题啊,那再查一下getItemViewType(int) /** * Get the type of View that will be created by {@link #getView} for the specified item. */ //看上面这一句,getItemViewType(int)决定了getView创建条目的类型,那么至此我们解决了这个问题,因为我们在getItemViewType(int)已经写上了获取的方法 //所以这里就可以像一个条目那么写了,不过多了几个else if(convertView == null){ //当是左边的条目的时候,那么加载左边 if(getItemViewType(position) == ConstantValue.LEFT){ convertView = View.inflate(getApplicationContext(),R.layout.left_item,null); //当是右边的条目的时候,那么加载右边 }else if(getItemViewType(position) == ConstantValue.RIGHT){ convertView = View.inflate(getApplicationContext(),R.layout.right_item,null); } //这两个写在外面就是为了简化代码 viewHolder = new ViewHolder(); viewHolder.tv_content = (TextView) convertView.findViewById(R.id.tv_content); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.tv_content.setText(getItem(position).data); return convertView; } private class ViewHolder { TextView tv_content; } }
5、设置适配器
private void setListView() { ListView listView = (ListView) findViewById(R.id.listview); listView.setAdapter(myAdapter); }
6、OK完成了,怎么样很容易吧,第一次写代码这么顺利,没有发现错误!!O(∩_∩)O,没有对着书抄哦,全是自己写的