Android ListView使用不同对象加载不同布局
来源:互联网 发布:绝地求生优化教程 编辑:程序博客网 时间:2024/06/07 16:03
因为未知原因,突然想到了关于一个 List 集合里面能否添加不同对象的问题,因为我们平时开发过程中,关于List 的比较常规的写法就是:
List<XXX> list = new ArrayList<XXX>();
这让我形成了一种 List 里面就只能添加一种类型的对象的潜在想法(或许是 Java 基础不够扎实)。
所以,我这里用代码确定一下,List 不给定泛型,然后迭代添加两种不同的对象,最后再迭代输出数据,看看是否会有问题,代码如下:
public class MainClass { private List list = new ArrayList(); public static void main(String args[]) { MainClass mc = new MainClass(); mc.initData(); for (int i = 0; i < 10; i++) { Object item = mc.list.get(i); if (item instanceof TestOther) { TestOther other = (TestOther) item; String company = other.getCompany(); String position = other.getPosition(); System.out.println("company : " + company + " , position : " + position); } else if (item instanceof TestBean1) { String name = ((TestBean1) item).getName(); String like = ((TestBean1) item).getLike(); System.out.println("name : " + name + " , like : " + like); } } } private void initData() { for (int i = 0; i < 10; i++) { if (i % 2 == 0) { list.add(new TestOther("Ekoo" + i, "Android Developer" + i)); } else { list.add(new TestBean1("Test" + i, "Coding" + i)); } } }}
那么我们的运行结果如下:
company : Ekoo0 , position : Android Developer0name : Test1 , like : Coding1company : Ekoo2 , position : Android Developer2name : Test3 , like : Coding3company : Ekoo4 , position : Android Developer4name : Test5 , like : Coding5company : Ekoo6 , position : Android Developer6name : Test7 , like : Coding7company : Ekoo8 , position : Android Developer8name : Test9 , like : Coding9
这里通过打印数据,确定了 List 中可以添加不同对象。
那么,这个问题明确之后,我想到了在之前的工作中,一直以为 ListView 列表数据中不能存有不同的对象,所有数据都只能在同一个对象中定义。这个时候,我们再去尝试一下,利用 List 中可以添加不同对象去测试一下 ListView 中 加载不同的布局。
首先,创建两个不同的对象 :
public class CompanyBean { private String company; private String position; private String address; public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }}public class UserBean { private String name; private String age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}
然后,我们在 Activity 中初始化一下模拟数据:
private void initData() { for (int i = 0; i < 20; i++) { // 这里随机生成 1到10 之间的随机数 int num = (int) (Math.random() * 10); if (num % 2 == 0) { UserBean bean1 = new UserBean(); bean1.setName("name" + i); bean1.setAge(num + ""); bean1.setSex("男"); list.add(bean1); } else { CompanyBean bean2 = new CompanyBean(); bean2.setCompany("HzEkoo" + i); bean2.setAddress("Ypsd201-4(" + i + ")"); bean2.setPosition("Android Developer" + i); list.add(bean2); } } }
接下来就是定义 Adapter 了。
private class TestAdapter extends BaseAdapter { private Context context; private List list; private LayoutInflater inflater; public TestAdapter(Context context, List list) { this.context = context; 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 getItemViewType(int position) { Object item = list.get(position); if (item instanceof UserBean) { return 0; } else if (item instanceof CompanyBean) { return 1; } return -1; } @Override public int getViewTypeCount() { return 2; } @Override public View getView(int position, View convertView, ViewGroup parent) { Object item = getItem(position); int type = getItemViewType(position); switch (type) { case 0: UserBean userBean = (UserBean) item; if (convertView == null) { convertView = inflater.inflate(R.layout.item_user, parent, false); } TextView tv_name = ViewHolder.get(convertView, R.id.tv_name); TextView tv_age = ViewHolder.get(convertView, R.id.tv_age); TextView tv_sex = ViewHolder.get(convertView, R.id.tv_sex); tv_name.setText(userBean.getName()); tv_age.setText(userBean.getAge()); tv_sex.setText(userBean.getSex()); break; case 1: CompanyBean comBean = (CompanyBean) item; if (convertView == null) { convertView = inflater.inflate(R.layout.item_company, parent, false); } TextView tv_company = ViewHolder.get(convertView, R.id.tv_company); TextView tv_position = ViewHolder.get(convertView, R.id.tv_position); tv_company.setText(comBean.getCompany()); tv_position.setText(comBean.getPosition()); break; } return convertView; } }
这个 Adapter 肯定是我最终的调试结果。关于 ViewHolder.get(View , id) 我之前博客 进一步简化你的 ViewHolder 有过介绍。
初期,我的想法是在 getView() 中根据判断 List 对应下标对象的类型 比如:
Object item = list.get(position);if (item instanceof UserBean) { UserBean userBean = (UserBean) item; // do something } else if (item instanceof CompanyBean) { CompanyBean comBean = (CompanyBean) item; // do something }
这样去判断加载不同的布局,进行数据填充,但是在进行滑动过程中,复用出现了混乱,导致直接闪退。
最终确定选择了使用 getItemViewType() 方法,不过,这个方法在使用的时候也是有个坑,那就是必须要重写getViewTypeCount() 方法,这个以前不怎么用,所以现在才发现这个问题。
最后附上一张效果图:
只是一个简单的测试。
Demo下载
- Android ListView使用不同对象加载不同布局
- android ListView加载不同布局
- android ListView加载不同布局
- Android Listview加载不同布局
- listView加载不同布局
- ListView加载不同布局
- ListView加载不同布局
- Listview加载不同布局
- listview加载不同布局
- ListView 加载不同布局
- Android listview 加载不同的布局实现
- ListView中加载不同布局
- ListView加载不同的布局
- listView 加载不同布局item
- android listview item 加载不同的布局样式文件
- Android Listview加载不同布局,ViewHolder类型转换异常!!!
- Android listview加载不同布局与adapter用法
- Android Listview加载不同布局,ViewHolder类型转换异常!!!
- 经典算法题:谷歌面试经典题目
- Unique Paths II
- Mybatis拦截器
- Centos7手动部署Openstack Mitaka版安装配置--(七)安装dashboard
- Tomcat处理HTTP请求源码分析--包含jsp内置对象的实例过程
- Android ListView使用不同对象加载不同布局
- Javascript数组的常用操作
- C++中利用回调实现消息通知
- 3-js面向对象基础 原型链进阶
- (Android)大牛、大神文章博客地址汇总。
- Hibernate常用注解
- 创建maven关联项目
- Centos7手动部署Openstack Mitaka版安装配置--(八)命令创建并使用实例
- Guess Number Higher or Lower