ListView终章

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,没有对着书抄哦,全是自己写的

目前为止,ListView暂时告一段落,如果有什么需要补充或者修改的,欢迎兄弟姐妹们提意见或者建议,全部接受哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值