ListView的多布局显示

关于ListView的多布局,我们经常可以在QQ聊天、微信聊天等见到这种情况,这里简单介绍ListVIew的简单聊天布局(两个布局),如果需要更多布局,只需根据相同的原理添加新布局就可


效果图

这里写图片描述


如果需要例子源码,请点击链接:http://pan.baidu.com/s/1jIFIxQe 密码:6bhv

Acitvity中的代码

 //Msg为一个Ben类,包含type(类型判断),msg(数据信息)
        List<Msg> list=new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            Msg msg=new Msg();
            if(i%2==0)
            {
                msg.type=MyAdapter.TYPE1;
                msg.msg="这是左边的消息"+i;
            }else {
                msg.type=MyAdapter.TYPE2;
                msg.msg="这是右边的消息"+i;
            }
            list.add(msg);
        }
        MyAdapter adapter=new MyAdapter(this,list);
        ListView listView= (ListView) findViewById(R.id.listView);
        listView.setAdapter(adapter);

核心代码MyAdapter

public class MyAdapter extends BaseAdapter {

    List<Msg> list;
    LayoutInflater inflater;

     //定义两个常量,分别对应布局种类数量
    // 数字必须充0开始,且数字大小必须小于种类数量,否则会报ArrayIndexOutOfBoundsException异常
    public static final int TYPE1 = 0;
    public static final int TYPE2 = 1;
//构造方法
    public MyAdapter(Context context, List<Msg> list) {
        this.list = list;
        inflater = LayoutInflater.from(context);
    }
//返回集合数据源大小
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    //多布局时必须返回布局种类数量
    @Override
    public int getViewTypeCount() {
        return 2;
    }

    //多布局时必须返回每个布局的类型
    @Override
    public int getItemViewType(int position) {
        return list.get(position).type;
    }

    //这里的方法跟单布局一样,只是多了一个判断,重写了一些重复的代码而已
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHoler1 holer1 = null;
        ViewHoler2 holer2 = null;
        if (convertView == null) {
            switch (list.get(position).type) {
                case TYPE1: {
                    convertView = inflater.inflate(R.layout.list_item_left, parent,false);
                    holer1 = new ViewHoler1();
                    holer1.imageView1 = (ImageView) convertView.findViewById(R.id.iv_head_left);
                    holer1.textView1 = (TextView) convertView.findViewById(R.id.tv_msg_left);
                    convertView.setTag(holer1);
                }
                break;
                case TYPE2: {
                    convertView = inflater.inflate(R.layout.listview_item_rigth, parent,false);
                    holer2 = new ViewHoler2();
                    holer2.imageView2 = (ImageView) convertView.findViewById(R.id.iv_head_right);
                    holer2.textView2 = (TextView) convertView.findViewById(R.id.tv_msg_right);
                    convertView.setTag(holer2);
                }
                break;
            }
        } else {
            //当convertView不为空时
            switch (list.get(position).type) {
                case TYPE1: {
                    holer1 = (ViewHoler1) convertView.getTag();
                }
                break;
                case TYPE2: {
                    holer2 = (ViewHoler2) convertView.getTag();
                }
                break;
            }
        }
        //按照类型设置数据
        switch (list.get(position).type) {
            case TYPE1: {
                holer1.textView1.setText(list.get(position).msg);
            }
            break;
            case TYPE2: {
                holer2.textView2.setText(list.get(position).msg);
            }
            break;

        }
        return convertView;
    }
    //==============================================================
    //设置ViewHoler区域
    class ViewHoler1 {
        ImageView imageView1;
        TextView textView1;
    }
    class ViewHoler2 {
        ImageView imageView2;
        TextView textView2;
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值