ListView Item多布局的实现

本节引言:本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现,

何为ListView Item多布局,打个比方,QQ这种聊天列表:

假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯!

一左一右,嘿嘿,本节就来教大家如何实现ListView的多布局!

1.要点讲解:重写getItemViewType()方法对应View是哪个类别,以及getViewTypeCount()方法iew返回

总共多少个类别!然后再getView那里调用getItemViewType获得对应类别,再加载对应的View!

2.代码实现:这里的话直接用上一节的两个布局,然后另外写一个Adapter重写要点中的几个几个地方:

MutiLayoutAdapter.java:

/**

* Created by Jay on 2015/9/23 0023.

*/

public class MutiLayoutAdapter extends BaseAdapter{

//定义两个类别标志

private static final int TYPE_BOOK = 0;

private static final int TYPE_APP = 1;

private Context mContext;

private ArrayList mData = null;

public MutiLayoutAdapter(Context mContext,ArrayList mData) {

this.mContext = mContext;

this.mData = mData;

}

@Override

public int getCount() {

return mData.size();

}

@Override

public Object getItem(int position) {

return mData.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

//多布局的核心,通过这个判断类别

@Override

public int getItemViewType(int position) {

if (mData.get(position) instanceof App) {

return TYPE_APP;

} else if (mData.get(position) instanceof Book) {

return TYPE_BOOK;

} else {

return super.getItemViewType(position);

}

}

//类别数目

@Override

public int getViewTypeCount() {

return 2;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

int type = getItemViewType(position);

ViewHolder1 holder1 = null;

ViewHolder2 holder2 = null;

if(convertView == null){

switch (type){

case TYPE_APP:

holder1 = new ViewHolder1();

convertView = LayoutInflater.from(mContext).inflate(R.layout.item_one, parent, false);

holder1.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);

holder1.txt_aname = (TextView) convertView.findViewById(R.id.txt_aname);

convertView.setTag(R.id.Tag_APP,holder1);

break;

case TYPE_BOOK:

holder2 = new ViewHolder2();

convertView = LayoutInflater.from(mContext).inflate(R.layout.item_two, parent, false);

holder2.txt_bname = (TextView) convertView.findViewById(R.id.txt_bname);

holder2.txt_bauthor = (TextView) convertView.findViewById(R.id.txt_bauthor);

convertView.setTag(R.id.Tag_Book,holder2);

break;

}

}else{

switch (type){

case TYPE_APP:

holder1 = (ViewHolder1) convertView.getTag(R.id.Tag_APP);

break;

case TYPE_BOOK:

holder2 = (ViewHolder2) convertView.getTag(R.id.Tag_Book);

break;

}

}

Object obj = mData.get(position);

//设置下控件的值

switch (type){

case TYPE_APP:

App app = (App) obj;

if(app != null){

holder1.img_icon.setImageResource(app.getaIcon());

holder1.txt_aname.setText(app.getaName());

}

break;

case TYPE_BOOK:

Book book = (Book) obj;

if(book != null){

holder2.txt_bname.setText(book.getbName());

holder2.txt_bauthor.setText(book.getbAuthor());

}

break;

}

return convertView;

}

//两个不同的ViewHolder

private static class ViewHolder1{

ImageView img_icon;

TextView txt_aname;

}

private static class ViewHolder2{

TextView txt_bname;

TextView txt_bauthor;

}

}这里有个地方要注意的,convertView.setTag(R.id.Tag_APP,holder1);我们平时都直接

setTag(Object)的,这个是setTag的重载方法,参数是一个唯一的key以及后面的一个对象!

唯一!!!我一开始直接把TYPE_BOOK作为第一个参数,然后就报下面这个错误:

The key must be an application-specific resource id就是前面这个要唯一,定义一个final类型的int变量和硬编码一个值的方式都是行不通的

这里的做法是直接在strings.xml中添加:

当然你也可以在res/values/下另外创建一个ids.xml文件,把上面这段代码贴上去!

除了这个还有一个要注意的地方,就是这个区分类别的标志要从0开始算,不然会报下面

这样的错误

MainActivity.java:

public class MainActivity extends AppCompatActivity {

private static final int TYPE_BOOK = 0;

private static final int TYPE_APP = 1;

private ListView list_content;

private ArrayList mData = null;

private MutiLayoutAdapter myAdapter = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//数据准备:

mData = new ArrayList();

for(int i = 0;i

switch ((int)(Math.random() * 2)){

case TYPE_BOOK:

mData.add(new Book("《第一行代码》","郭霖"));

break;

case TYPE_APP:

mData.add(new App(R.mipmap.iv_icon_baidu,"百度"));

break;

}

}

list_content = (ListView) findViewById(R.id.list_content);

myAdapter = new MutiLayoutAdapter(MainActivity.this,mData);

list_content.setAdapter(myAdapter);

}

}

上面随机生成0和1,0就往集合中添加一个Book的对象,1的话就添加一个App的对象!

3.代码下载:

ListViewDemo6.zip

本节小结:好的,本节给大家讲解了ListView Item多布局的实现,就是两个方法的重写,

然后getView()做下判断,设置不同的布局而已~代码非常简单~

关于ListView的知识就告一段落吧,当然ListView的知识并不止这些,

异步加载,优化等等,这些我们都会在进阶部分进行学习~就说这么多,谢谢~

php listview,ListView Item多布局的实现相关推荐

  1. 关于安卓listview获得item中的控件问题

    我的程序里面是用到了安卓的listview来显示数据,主要用SimpleAdapter适配器,然而怎么获取listview的item中的控件呢?就如说我这里做了一个显示地址管理. 而让我苦恼的是要怎么 ...

  2. android 获取其他布局,android listview onItemClick中获取其他item的布局

    功能需求: 需要再点击一条listview的item时 , 获取到其他item中 布局 (layout 或者image textview 等) mListView.performItemClick(m ...

  3. 【Android 】零基础到飞升 | ListView Item多布局的实现

    2.5.1 ListView Item多布局的实现 本节引言: 本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打 ...

  4. Android基础入门教程——2.4.8 ListView Item多布局的实现

    Android基础入门教程--2.4.8 ListView Item多布局的实现 标签(空格分隔): Android基础入门教程 本节引言: 本节是ListView这个小节的最后一节,给大家带来的是L ...

  5. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...

    1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为        2,为了使LISTVIEW的ITEM在点 ...

  6. 关于listView的item失去焦点不能点击 Item中包含Button 导致抢占焦点

    今天发现一个问题.listView的item点击以后进入到下一个页面,下个页面有个返回按钮,直接返回回去以后点击事件不能触发,滑动或者重新打开这个listView,就可以达到原来的效果.后来发现是因为 ...

  7. 如何设置listview每个item高度

    据我所了解,listview每行的宽度是由 inflater填充布局中高度最大的那个控件的高度... public  void setListViewHeightBasedOnChildren(Lis ...

  8. (android控件)ListView的Item中设置按钮实现

    前言 在项目的开发过程中,需要Listview的Item中包含按钮的效果.在实际开发过,Item中放置按钮后,ListView 单行选择背景颜色变化的效果没有了. 问题原因 ListView 和 其它 ...

  9. android listview 列加id,Android实战开发之ListView同一个item显示2列的实现方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用List ...

最新文章

  1. 使用spark-sql-perf评测spark 2.0
  2. Leetcode 46.全排列 (每日一题 20210621)
  3. linux 信号灯超时时间到,急!!信号灯超时时间已到错误又出来了!!!!
  4. 【大学课程】线性代数基础知识点
  5. jmeter(五)几种不同的content-type方式
  6. 企业要顺应社会生态环境
  7. 十万服务器秒级管控 腾讯云如何将AIOps用于日常管理?
  8. 程序员工资那么高,却不知道怎么花?程序员花钱指南了解一下!
  9. redhat rhel 7中如何切换中英文输入法。
  10. H5编辑器核心算法和思想-遁地龙卷风
  11. 数据库内容:用于园林施工与养护的学习软件系统
  12. c语言int doubt,c语言错误error: incompatible types in assignment
  13. python 豆瓣高分电影爬虫
  14. 泛泰A870刷4.4专用英文版非触摸CWM Recovery 6.0.4.8(三版通刷)
  15. tpshop报 商业用途必须购买正版,使用盗版将追究法律责任
  16. 我为什么要立刻放弃React而使用Vue?
  17. java爬虫模拟post请求_java爬虫之使用HttpClient模拟浏览器发送请求方法详解
  18. 今日分享-ios蓝牙
  19. 上海航芯| BMS专题之BMS基础功能模块概述分享
  20. cisco catelyst 3560 常见问题

热门文章

  1. acs880变频器选型手册_据说这是变频器知识里讲的最全的了,小编拿来分享给大家!...
  2. springcloud 整合 gateway_GitHub上最火的SpringCloud微服务商城系统项目,附全套教程
  3. 【数理知识】《随机过程》方兆本老师-第1章-引论
  4. 【控制】《多无人机协同控制技术》周伟老师-第2章-多无人机协同控制体系结构
  5. LaTex 版面设计
  6. 1.12 梯度的数值逼近-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  7. Altium designer不显示飞线的三种方法
  8. 【GUI转exe】Matlab将GUI转化为exe文件
  9. 基于PSO的运输优化算法的MATLAB仿真
  10. 职场10不要【来自网络】