博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android学习总结(十四) ———— ListView Item多布局的实现
阅读量:4659 次
发布时间:2019-06-09

本文共 6617 字,大约阅读时间需要 22 分钟。

一、基本概念 

  实现一个Item的多布局。像我们经常在用的各种即时通讯工具,QQ、微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是返回Item的种类数目,第二个是返回当前Item是哪种类型重写getItemViewType()方法对应View是哪个类别,以及getViewTypeCount()方法返回 view总共多少个类别!然后再getView那里调用getItemViewType获得对应类别,再加载对应的View!

二、示例代码

  先建两个javaBean,一个是App,一个是Book,代码如下所示:

package com.nyl.updatelistview;/** * Created by Administrator on 2017/3/11 0011. */public class App {    private int icon;    private String name;    public App(int icon,String name){        this.icon = icon;        this.name = name;    }    public int getIcon() {        return icon;    }    public void setIcon(int icon) {        this.icon = icon;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

 

package com.nyl.updatelistview;/** * Created by Administrator on 2017/3/11 0011. */public class Book {    private String name;    private String author;    public Book(String name,String author){        this.author = author;        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }}

  接下来建两个布局,布局也是非常简单的,代码如下所示:

  在写适配器类之前,我们先定义好Book和App的Id,在strings.xml的目录里建,代码如下:

  好了,这些都是比较简单的,我们进入核心写一个MutiLayoutAdapter多个布局大适配器,代码如下所示:

package com.nyl.updatelistview;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import java.util.ArrayList;/** * Created by Administrator on 2017/3/11 0011. */public class MutiLayoutAdapter extends BaseAdapter{    //定义两个类别标准    private static final int TYPE_BOOK = 0;    private static final int TYPE_APP = 1;    private Context context;    private ArrayList data = null;    public MutiLayoutAdapter(Context context,ArrayList data){        this.context = context;        this.data = data;    }    @Override    public int getCount() {        return data.size();    }    @Override    public Object getItem(int i) {        return data.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    //多布局的核心,通过这个判断类别    @Override    public int getItemViewType(int position) {        if (data.get(position) instanceof App){            return TYPE_APP;        }else if (data.get(position) instanceof Book){            return TYPE_BOOK;        }else {            return super.getItemViewType(position);        }    }    //类别项目    @Override    public int getViewTypeCount() {        return 2;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        //获取item视图类别        int type = getItemViewType(i);        ViewHolder1 holder1 = null;        ViewHolder2 holder2 = null;        if (view == null){            //根据类别加载视图            switch (type){                case TYPE_APP:                    holder1 = new ViewHolder1();                    view = LayoutInflater.from(context).inflate(R.layout.item_one,viewGroup,false);                    holder1.img_icon = (ImageView) view.findViewById(R.id.img_icon);                    holder1.txt_name = (TextView) view.findViewById(R.id.txt_name);                    //缓存ViewHolder1,使用的key是strings.xml中定义的Tag_APP                    view.setTag(R.id.Tag_APP,holder1);                    break;                case TYPE_BOOK:                    holder2 = new ViewHolder2();                    view = LayoutInflater.from(context).inflate(R.layout.item_two,viewGroup,false);                    holder2.txt_bauthor = (TextView) view.findViewById(R.id.txt_bauthor);                    holder2.txt_bname = (TextView) view.findViewById(R.id.txt_bname);                    //缓存ViewHolder2,使用的key是strings.xml中定义的Tag_Book                    view.setTag(R.id.Tag_Book,holder2);                    break;            }        }else {            switch (type){                case TYPE_APP:                    holder1 = (ViewHolder1) view.getTag(R.id.Tag_APP);                    break;                case TYPE_BOOK:                    holder2 = (ViewHolder2) view.getTag(R.id.Tag_Book);                    break;            }        }        Object object = data.get(i);        //设置控件的值        switch (type){            case TYPE_APP:            App app = (App) object;                if (app != null){                    holder1.img_icon.setImageResource(app.getIcon());                    holder1.txt_name.setText(app.getName());                }                break;            case TYPE_BOOK:                Book book = (Book) object;                if(book != null){                    holder2.txt_bname.setText(book.getName());                    holder2.txt_bauthor.setText(book.getAuthor());                }                break;        }        return view;    }    //两个不同的ViewHolder    private class ViewHolder1 {        ImageView img_icon;        TextView txt_name;    }    private class ViewHolder2 {        TextView txt_bname;        TextView txt_bauthor;    }}

  最后一步是自然而然就是MainActivity.java,代码如下:

package com.nyl.updatelistview;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import java.util.ArrayList;public class MainActivity extends Activity {    private static final int TYPE_BOOK = 0;    private static final int TYPE_APP = 1;    private ListView listView;    private ArrayList data = new ArrayList<>();    private MutiLayoutAdapter myAdapter = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //数据准备        data = new ArrayList();        for (int i = 0; i < 20;i++){            switch ((int) (Math.random() * 2)){                case TYPE_BOOK:                    data.add(new Book("《第一行代码》","郭霖"));                    break;                case TYPE_APP:                    App app = new App(R.mipmap.book_center__ic_video_media_thumb_disabled,"海豚");                    data.add(app);                    break;            }        }        listView = (ListView) findViewById(R.id.listView);        myAdapter = new MutiLayoutAdapter(MainActivity.this,data);        listView.setAdapter(myAdapter);    }}

  运行效果如下:

  

   ListView Item多布局就学到这里,希望对android学习者有所帮助!

 

转载于:https://www.cnblogs.com/nylcy/p/6535565.html

你可能感兴趣的文章
获得屏幕像素以及像素密度
查看>>
int与string转换
查看>>
adb命令 判断锁屏
查看>>
推荐一个MacOS苹果电脑系统解压缩软件
查看>>
1035等差数列末项计算
查看>>
CDMA鉴权
查看>>
ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
查看>>
过滤器与拦截器区别
查看>>
第二阶段站立会议7
查看>>
JAVA多线程
查看>>
delphi 更改DBGrid 颜色技巧
查看>>
POJ 2031 Building a Space Station
查看>>
任意阶幻方(魔方矩阵)C语言实现
查看>>
织梦教程
查看>>
杭电多校 Harvest of Apples 莫队
查看>>
C/C++心得-结构体
查看>>
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>