ListView多条目加载

来源:互联网 发布:上海fly滑板店淘宝店 编辑:程序博客网 时间:2024/05/18 14:24

这里写图片描述

在现实的项目开发中,listView往往会加载不同类型的数据,这就要求我们要对listView进行多条目的加载,对数据类型进行判断,怎么判断呢?主要在适配器里面进行类型的判断。

结构图:
这里写图片描述

先看一下布局文件:
activity.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.day9listviewmore.MainActivity" >    <ListView        android:id="@+id/lv"        android:layout_width="match_parent"        android:layout_height="match_parent"/></RelativeLayout>

list_item0.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.day9listviewmore.MainActivity" >    <TextView         android:id="@+id/tv0"        android:layout_width="match_parent"        android:layout_height="wrap_content"        /></RelativeLayout>

list_item1.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.day9listviewmore.MainActivity" >    <TextView         android:id="@+id/tv1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        />    <ImageView         android:id="@+id/iv1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@+id/tv1"        android:src="@drawable/ic_launcher"        /></RelativeLayout>

适配文件:

News.java:

public class News {    int type; //10001:显示新闻   10002:显示广告   20001 20002    String title;    public int getType() {        return type;    }    public void setType(int type) {        this.type = type;    }    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public News(int type, String title) {        super();        this.type = type;        this.title = title;    }    @Override    public String toString() {        return "News [type=" + type + ", title=" + title + "]";    }}

主要代码如下:在listView适配器重写的四个方法的基础上,再手动重写两个方法,分别是:getViewTypeCount(),getItemViewType(int position),这两个方法,第一个是确定加载条木有几种数据类型,第二个是对数据进行判断和分类的。

MainActivity.java:

import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import com.example.day9listviewmore.bean.News;public class MainActivity extends Activity {    ListView lv;    List<News> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv = (ListView) findViewById(R.id.lv);        initData();        MyAdapter adapter = new MyAdapter();        lv.setAdapter(adapter);    }    private void initData() {        list = new ArrayList<News>();        for (int i = 0; i < 100; i++) {            News news;            if(i%7 == 5){                news = new News(10002, "广告" + i);            }else{                news = new News(10001, "正文标题" + i);            }            list.add(news);        }    }    /**     * 1、需要重写两个方法     * 2、getViewTypeCount的返回值必须要大于getItemViewType的返回值     * 3、对于返回的Type类型 通常定义成 静态常量来区分     * @author Administrator     *     */    class MyAdapter extends BaseAdapter{        public static final int TYPE_ONE = 0;        public static final int TYPE_TWO = 1;        @Override        public int getCount() {            // TODO Auto-generated method stub            return list.size();        }        //在使用多条目加载的时候    返回当前position对应的类型        //************必须满足的条件   getItemViewType的返回值  必须要小于getViewTypeCount的返回值        @Override        public int getItemViewType(int position) {            // TODO Auto-generated method stub            if(list.get(position).getType() == 10001){                return TYPE_ONE;            }else{                return TYPE_TWO;            }        }        //使用多条目加载时   一共有几种类型        //从写该方法后,listview控件会知道  当前的布局样式不止一种          //所以 当ListView发现convertview在复用时  类型不配不上时  会重写让convertView加载一遍布局        @Override        public int getViewTypeCount() {            // TODO Auto-generated method stub            return 2;        }        @Override        public Object getItem(int position) {            // TODO Auto-generated method stub            return null;        }        @Override        public long getItemId(int position) {            // TODO Auto-generated method stub            return 0;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder0 holder0 = null;            ViewHolder1 holder1 = null;            int type = getItemViewType(position);            if(convertView == null){                if(type == TYPE_ONE){                    convertView = View.inflate(MainActivity.this, R.layout.list_item0, null);                    holder0 = new ViewHolder0();                    holder0.tv0 = (TextView) convertView.findViewById(R.id.tv0);                    convertView.setTag(holder0);                }else{                    convertView = View.inflate(MainActivity.this, R.layout.list_item1, null);                    holder1 = new ViewHolder1();                    holder1.tv1 = (TextView) convertView.findViewById(R.id.tv1);                    convertView.setTag(holder1);                }            }else{                if(type == TYPE_ONE){                    holder0 = (ViewHolder0) convertView.getTag();                }else{                    holder1 = (ViewHolder1) convertView.getTag();                }            }            //根据不同的情况  把进行赋值            if(type == TYPE_ONE){                holder0.tv0.setText(list.get(position).getTitle());            }else{                holder1.tv1.setText(list.get(position).getTitle());            }            return convertView;        }    }    public static class ViewHolder0{        TextView tv0;    }    public static class ViewHolder1{        TextView tv1;        ImageView iv1;    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 斗鱼主播积分太低无法收礼物怎么办 信誉积分没有了什么也玩不了怎么办 忘记自己电信卡号的密码怎么办 淘宝卖出去东西的钱被冻结了怎么办 手机店铺搞抽奖活动上当了怎么办 网易云音乐上传作品编辑失败怎么办 手机连了wifi后自动扣费怎么办 店铺被低价拍了一部分商品该怎么办 淘宝买家退货快递单号填错了怎么办 卖家同意退款了买家不退货怎么办 淘宝代购衣服有破损不给退怎么办 网上购飞机票身份证号写错了怎么办 交易猫买家把我号清了怎么办 光大普卡额度4万封顶了怎么办 天天特价通过后价格设置错误怎么办 苏宁易购不小心点了免密支付怎么办 别人知道自己京东的账号密码怎么办 oppo手机刷机要锁屏密码怎么办 在苏宁易购退款成功又收到货怎么办 今日头条转发出现未安装微信怎么办 打开手机后自动弹出广告怎么办去除 朋友圈发广告被腾讯屏蔽了怎么办 新商盟手机订烟登录密码忘了怎么办 手机版战神斯巴达幽灵经常崩怎么办 代购买的东西被海关扣了怎么办 托朋友代购给了钱联系不上人怎么办 签了合同被加盟商骗了怎么办 百度云盘下载时本地空间不足怎么办 百度云盘隐私空间没密码忘了怎么办 华为云空间的帐号密码忘记了怎么办 快递被快递公司弄丢了怎么办 快递到了人不在那个地方了怎么办 微信被骗了1千多怎么办 客户货已经用啦要求退款退货怎么办 网购收到别人退货的东西怎么办 好省输入订单编号查不到订单怎么办 快递没有当面验收后发现损坏怎么办 支付宝电脑付款风控异常怎么办 京东买东西地址填错了怎么办 商场卖的衣服跟官网差价大怎么办 网购的衣服有好几个破洞怎么办