Android学习总结(十四) ———— ListView Item多布局的实现
一、基本概念
实现一个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;
}
}
接下来建两个布局,布局也是非常简单的,代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="5dp"> <ImageView
android:id="@+id/img_icon"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@mipmap/book_center__ic_video_media_thumb_disabled" /> <TextView
android:id="@+id/txt_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:text="Test"
android:textSize="20sp" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="10dp"> <TextView
android:id="@+id/txt_bname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="《第一行代码Android》"
android:textColor="#F3684A"
android:textSize="18sp" /> <TextView
android:id="@+id/txt_bauthor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="郭霖"
android:textColor="#44BDED"
android:textSize="18sp" /> </LinearLayout>
在写适配器类之前,我们先定义好Book和App的Id,在strings.xml的目录里建,代码如下:
<item name="Tag_APP" type="id"></item>
<item name="Tag_Book" type="id"></item>
好了,这些都是比较简单的,我们进入核心写一个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<Object> data = null; public MutiLayoutAdapter(Context context,ArrayList<Object> 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<Object> data = new ArrayList<>();
private MutiLayoutAdapter myAdapter = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //数据准备
data = new ArrayList<Object>();
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学习者有所帮助!
Android学习总结(十四) ———— ListView Item多布局的实现的更多相关文章
- Android学习(十四) Service组件
一.定义 运行在后台,没有页面,不可见.优先级高于Activity,当系统内存不足时,会先释放一些Activity.注意,Service同样是运行在主线程中,不能做一些耗时操作.如果一定要做一些耗时的 ...
- android 学习随笔十四(页面跳转与数据传递)
1.activity 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> ...
- 前端学习(十四):CSS布局
进击のpython ***** 前端学习--CSS布局 每个模块的相关央视就算是进本上都完成了,但是,这些模块想放在不同的位置 横着放,竖着放,斜着放... ... 想怎么放怎么放 那就用到了今天要说 ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 十一、Android学习第十天——项目开始(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十一.Android学习第十天——项目开始 Android知识点的学习告一 ...
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- Linux学习之十四、管线命令
Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php
- 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击
风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...
- android学习--视图列表(ListView和ListActivity)
说明: 视图列表(ListView和ListActivity)与AutoComplete.Spinner类似,它们都须要一个供显示的列表项,能够须要借助于内容Adapter提供显示列表项 创建List ...
随机推荐
- Java字符串理解
1. 字符串基本知识 用java.lang.String类的对象表示字符串 字符串类型不是基本类型, 而是引用类型(类似于数组和对象) Java基于Unicode字符集 2. 字符串创建 public ...
- Visual Studio Ultimate 2013 下载地址
VS2013_RTM_ULT_CHS.iso 文件大小:2.87G 百度网盘下载地址: http://pan.baidu.com/s/1bn4gavX 微软官网下载地址: http://downloa ...
- Request.UrlReferrer 实现页面刷新
在使用Ajax 异步提交表单的时候,需要返回某些状态信息.但如果把需要返回的如分页.过滤的参数写在控制器的参数里面,会比较繁琐. 因此,1.可以在控制器里面使用 Request 对象的请求的URL. ...
- mysql server安装(windows)
1 在 https://dev.mysql.com/downloads/mysql/ 上下载mysql压缩包 2 解压,并把bin目录加入环境变量 3 初始化,完成后会在mysql根目录下生成data ...
- c++中的友元重载
1 语法 返回值类型 operator 运算符名称(形参列表) { 重载实体 } --------->operator和运算符名称在一起构造成新的函数名 2 案例 #include <io ...
- 反射invoke()方法
invoke()方法: 主要是为了类反射,可以在不知道具体类的情况下,根据配置字符串去调用一个类的方法.最简单的方法是可以把方法参数化. main.invoke(): 比如Test类里有 ...
- UVaLive 3695 City Game (扫描线)
题意:给定m*n的矩阵,有的是空地有的是墙,找出一个面积最大的子矩阵. 析:如果暴力,一定会超时的.我们可以使用扫描线,up[i][j] 表示从(i, j)向上可以到达的最高高度,left[i][j] ...
- CodeForces 628B New Skateboard 思维
B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- ugui batches
先渲染非重叠,然后渲染重叠 如果两个图不是同一个图集,并且都不重叠,那么按节点挂载顺序渲染 节点挂接多复杂没关系,关键是节点在Canvas下的顺序,绑在同一节点或者全部绑在根节点Canvas下渲染 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Session优缺点
● 数据存储在服务器,安全. ● session能保存Object类型数据,也就是说能存储任意数据. ● 可存储的数据大小,理论上是无限制的. ● 因为数据存储在服务器端,当用户比较多时,会占 ...