打开各种客户端发现 Listview的布局多种多样,在我以前的认知中listview不是只能放一种item布局嘛,我就震惊了,现在我自己的项目上要用到这种方式那么就去做下

原理是listview 的adapter中 有这两个方法

// 返回当前布局的样式type
@Override
public int getItemViewType(int position) {
return listDatas.get(position).type;
} // 返回你有多少个不同的类型的数量
@Override
public int getViewTypeCount() {
return 3;
}

过程 1 定义一个javabeen对象

package com.example.listviewdemo;

import java.util.HashMap;
import java.util.Map; /**
* Created by Ace on 2016/2/13.
*/
public class lIstViewItem {
// 用于区分listview显示的不同item,告诉适配器我这是什么类型,listview适配器根据type决定怎么显示
public int type;
// 将要显示的数据用HashMap包装好
public HashMap<String, Object> map; public lIstViewItem(int type, HashMap<String, Object> map) {
this.type = type;
this.map = map;
}
}

2 把数据封装在泛型是我们JAVABeen对象的的数组里

package com.example.listviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView; import java.util.ArrayList;
import java.util.HashMap; /**
* Created by Ace on 2016/2/13.
*/ public class MainActivity extends Activity {
private ListView listView; // 页面listview
private ListViewAdapter listViewAdapter; // listview适配器
private ArrayList<lIstViewItem> viewItemsArraylist; // Arraylist主要装载的是传给适配器的数据集合 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
// 为listview设置适配器
// ListViewAdapter listViewAdapter = new ListViewAdapter(MainActivity.this, getDatas()); } private void initData() { } // 初始化页面组件及一些布局
private void initView() {
listView = (ListView) this.findViewById(R.id.listview);
listViewAdapter = new ListViewAdapter(MainActivity.this, getDatas());
listView.setAdapter(listViewAdapter);
} /**
* 这里我们用三种不同的样式进行测试
**/
private ArrayList<lIstViewItem> getDatas() { viewItemsArraylist = new ArrayList<lIstViewItem>();
viewItemsArraylist.add(new lIstViewItem(2, getHashMapThirdType("美人鱼", "没有买卖就没有杀害", "2016-2-13")));
viewItemsArraylist.add(new lIstViewItem(1, getHashMapSecondType("单身狗", "情人节自己过")));
viewItemsArraylist.add(new lIstViewItem(0, getHashMapFirstType("周杰伦")));
viewItemsArraylist.add(new lIstViewItem(0, getHashMapFirstType("周星驰")));
viewItemsArraylist.add(new lIstViewItem(1, getHashMapSecondType("猴子", "齐天大圣孙悟空"))); return viewItemsArraylist;
} // 第一种样式,只传输一个数据
private HashMap<String, Object> getHashMapFirstType(String firstTheme) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("Theme", firstTheme);
return hashMap;
} // 第二种样式,传输两个数据
private HashMap<String, Object> getHashMapSecondType(String secondTheme, String secondContent) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("Theme", secondTheme);
hashMap.put("Content", secondContent);
return hashMap;
} // 第三种样式,传输三个数据
private HashMap<String, Object> getHashMapThirdType(String threeTheme, String threeContent, String date) {
HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put("Theme", threeTheme);
hashMap.put("Content", threeContent);
hashMap.put("Date", date);
return hashMap;
} }

adapter中设置我们现实的条目

package com.example.listviewdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; import java.util.ArrayList; /**
* Created by Ace on 2016/2/13.
*/
public class ListViewAdapter extends BaseAdapter {
private LayoutInflater mLayoutInflater;
private Context context;
private ArrayList<lIstViewItem> listDatas; public ListViewAdapter(Context context, ArrayList<lIstViewItem> listDatas) {
this.listDatas = listDatas;
mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} // 返回当前布局的样式type
@Override
public int getItemViewType(int position) {
return listDatas.get(position).type;
} // 返回你有多少个不同的类型的数量
@Override
public int getViewTypeCount() {
return 3;
} @Override
public int getCount() {
return listDatas.size();
} @Override
public Object getItem(int position) {
return listDatas.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
lIstViewItem listItem = listDatas.get(position);
int Type = getItemViewType(position);//拿到当前条目的类型
ViewHolderfirstType viewHolderfirstType = null;
ViewHoldersecondType viewHoldersecondType = null;
ViewHolderThirdType viewHolderThirdType = null;
if (convertView == null) {//对类型进行判断
switch (Type) {
case 0:
viewHolderfirstType = new ViewHolderfirstType();
convertView = mLayoutInflater.inflate(R.layout.activity_first_type_item, null);
viewHolderfirstType.tv_first_theme = (TextView) convertView.findViewById(R.id.tv_first_theme);
viewHolderfirstType.tv_first_theme.setText(listItem.map.get("Theme").toString());
convertView.setTag(viewHolderfirstType); break;
case 1:
viewHoldersecondType = new ViewHoldersecondType();
convertView = mLayoutInflater.inflate(R.layout.activity_sencond_type_item, null);
viewHoldersecondType.tv_second_content = (TextView) convertView.findViewById(R.id.tv_second_content);
viewHoldersecondType.btn_second_theme = (Button) convertView.findViewById(R.id.btn_second_theme);
viewHoldersecondType.tv_second_content.setText(listItem.map.get("Theme").toString());
viewHoldersecondType.btn_second_theme.setText(listItem.map.get("Content").toString());
convertView.setTag(viewHoldersecondType); break;
case 2: viewHolderThirdType = new ViewHolderThirdType();
convertView = mLayoutInflater.inflate(R.layout.activity_third_type_item, null);
viewHolderThirdType.tv_three_content = (TextView) convertView.findViewById(R.id.tv_three_content);
viewHolderThirdType.et_three_theme = (EditText) convertView.findViewById(R.id.et_three_theme);
viewHolderThirdType.tv_three_time = (TextView) convertView.findViewById(R.id.tv_three_time);
viewHolderThirdType.et_three_theme.setText(listItem.map.get("Theme").toString());
viewHolderThirdType.tv_three_content.setText(listItem.map.get("Content").toString());
viewHolderThirdType.tv_three_time.setText(listItem.map.get("Date").toString());
convertView.setTag(viewHolderThirdType); break;
}
} else {
switch (Type) {
case 0:
viewHolderfirstType = (ViewHolderfirstType) convertView.getTag();
viewHolderfirstType.tv_first_theme.setText(listItem.map.get("Theme").toString());
break;
case 1:
viewHoldersecondType = (ViewHoldersecondType) convertView.getTag();
viewHoldersecondType.tv_second_content = (TextView) convertView.findViewById(R.id.tv_second_content);
viewHoldersecondType.btn_second_theme = (Button) convertView.findViewById(R.id.btn_second_theme);
viewHoldersecondType.tv_second_content.setText(listItem.map.get("Theme").toString());
viewHoldersecondType.btn_second_theme.setText(listItem.map.get("Content").toString());
break;
case 2:
viewHolderThirdType = (ViewHolderThirdType) convertView.getTag();
viewHolderThirdType.tv_three_content = (TextView) convertView.findViewById(R.id.tv_three_content);
viewHolderThirdType.et_three_theme = (EditText) convertView.findViewById(R.id.et_three_theme);
viewHolderThirdType.tv_three_time = (TextView) convertView.findViewById(R.id.tv_three_time);
viewHolderThirdType.et_three_theme.setText(listItem.map.get("Theme").toString());
viewHolderThirdType.tv_three_content.setText(listItem.map.get("Content").toString());
viewHolderThirdType.tv_three_time.setText(listItem.map.get("Date").toString());
break;
} }
return convertView;
} class ViewHolderfirstType {
TextView tv_first_theme;
} class ViewHoldersecondType {
TextView tv_second_content;
Button btn_second_theme;
} class ViewHolderThirdType {
EditText et_three_theme;
TextView tv_three_content;
TextView tv_three_time;
}
}

我的genymotion又挂了......................................    布局看viewholder就知道了..不写了

Listview实现不同类型的布局的更多相关文章

  1. 在ListView中使用多个布局

    要想在一个ListView中使用多个布局文件,比如一个信息List包含了一个信息标题和每个信息对应的时间. 关键的步骤是实现Adapter类的getItemViewType 和getViewTypeC ...

  2. android listview需要呈现多个布局

    android listview需要呈现多个布局 之前的做法很笨 在getView()方法里面,不仅将viewHolder作为tag属性设置给convertView 还将当前的position作为ta ...

  3. 026 Android 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+读取内存空间、手机进程信息+常驻悬浮框

    1.目标效果 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+常驻悬浮框 2.页面布局文件 (1)activity_process_manager.xml <?xml ...

  4. Listview使用安卓自带布局实现单选

    安卓提供了一些自带的布局,使用非常简单.直接看代码吧. package com.example.linfeng.myapplication; import android.app.Activity; ...

  5. ListView之多种类型Item

    一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...

  6. Android ListView添加多种类型的ItemView

    一般复杂的ListView都会重写BaseAdapter,通过重用convertView来减少inflate,通过setTag()和ViewHolder改变ItemView的内容. 重写BaseAda ...

  7. Android进阶笔记11:ListView篇之ListView显示多种类型的条目(item)

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...

  8. ListView中不同类型view的实现

    首先创建请求队列,一个活动中只需要一个,因此放在Application中: public class MyApplication extends Application{ private static ...

  9. ListView显示多种类型的item

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似 这是MainActivity:,MainActivity的布局就是一个ListView public class Mai ...

随机推荐

  1. Java 之 内部类

    (static修饰的成员属于整个类,而不属于单个对象) 定义:将一个类放到另一个类的内部定义,这个在内部定义的类就叫做内部类(也有的成嵌套类),包含内部类的类被称为外部类(也有的称宿主类). 1.非静 ...

  2. iOS开发中的一些定时器

    在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资 ...

  3. Linux套接字编程

    网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...

  4. Effective Java 71 Use lazy initialization judiciously

    Lazy initialization - It decreases the cost of initializing a class or creating an instance, at the ...

  5. linux下重启oracle服务:监听器和实例

    一.在Linux下重启Oracle数据库及监听器: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart ...

  6. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结

    Tempdb系统数据库是一个全局资源,可供连接到SQL Server实例的所有用户使用. 存储的内容项: 1.用户对象 用户对象由用户显示创建.这些对象可以位于用户会话的作用域中,也可以位于创建对象所 ...

  7. MemSQL分布式架构介绍(二)

    接上次的MemSQL分布式架构介绍(一),原文在这里:http://docs.memsql.com/latest/concepts/distributed_architecture/ 首先上张图,是我 ...

  8. oracle数据库ORA-01654 错误的解决方法

    引言: 数据库突然报: ORA-01654: unable to extend index BO.INDEX_indexname by 311072 in tablespace 错误,上网查原因,发现 ...

  9. APP原型设计工具,哪家强?转自知乎

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:李志超 链接:http://www.zhihu.com/question/20403141/answer/25329730 ...

  10. 启动rabbitmq web管理后台插件

    安装完rabbitmq server之后,访问http://server_ip:15672/  无法打开网页, 通过netstat -ano |grep 15672 查看此端口号并没有开启 需要启用 ...