Listview实现不同类型的布局
打开各种客户端发现 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实现不同类型的布局的更多相关文章
- 在ListView中使用多个布局
要想在一个ListView中使用多个布局文件,比如一个信息List包含了一个信息标题和每个信息对应的时间. 关键的步骤是实现Adapter类的getItemViewType 和getViewTypeC ...
- android listview需要呈现多个布局
android listview需要呈现多个布局 之前的做法很笨 在getView()方法里面,不仅将viewHolder作为tag属性设置给convertView 还将当前的position作为ta ...
- 026 Android 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+读取内存空间、手机进程信息+常驻悬浮框
1.目标效果 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+常驻悬浮框 2.页面布局文件 (1)activity_process_manager.xml <?xml ...
- Listview使用安卓自带布局实现单选
安卓提供了一些自带的布局,使用非常简单.直接看代码吧. package com.example.linfeng.myapplication; import android.app.Activity; ...
- ListView之多种类型Item
一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍 ...
- Android ListView添加多种类型的ItemView
一般复杂的ListView都会重写BaseAdapter,通过重用convertView来减少inflate,通过setTag()和ViewHolder改变ItemView的内容. 重写BaseAda ...
- Android进阶笔记11:ListView篇之ListView显示多种类型的条目(item)
ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...
- ListView中不同类型view的实现
首先创建请求队列,一个活动中只需要一个,因此放在Application中: public class MyApplication extends Application{ private static ...
- ListView显示多种类型的item
ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似 这是MainActivity:,MainActivity的布局就是一个ListView public class Mai ...
随机推荐
- iOS开发--隐藏(去除)导航栏底部横线
iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分享来给小伙伴们. 1)声明UIImageV ...
- ios开发随笔第一篇-button,label按钮的一些属性的使用
我用的是纯代码方式,喜欢用storyboard开发的其实也很爽了; 首先谈谈button,ios中新建button这个对象一般接触的都明白,UIButton *button名=[ UIButton a ...
- 给Macbook装系统的网址
- android 进程间通信---Service Manager(1)
Bind机制由4个部分组成.bind驱动,Client,ServiceManager &Service 1.Bind其实是一个基于linux系统的驱动,目的是为了实现内存共享. bind驱动的 ...
- iOS 应用架构浅谈
当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: 简单来说就是调API,展示页面,然后跳转到别的地方再调API,再展示页面. App确实就 ...
- JavaScript Patterns 3.4 Array Literal
Array Literal Syntax To avoid potential errors when creating dynamic arrays at runtime, it's much sa ...
- 解决android的ListView嵌套在ScrollView中不能被滚动的问题
使用滚动条容易带来一个后果,就是高度和宽度不受控制了, 之前就遇到一个已经有ScrollView的页面需要加个列表listView,然后就发现listView只看到前两行数据,下面的看不到,拉滚动条也 ...
- Linux学习之二——档案与目录的属性和权限
一.属性和权限的基本概念 Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,这三种身份各有 read/write/execute 等权限. 所有的系统上的账号 ...
- 聚合数据天气预报API-ajax 通过城市名取数据
如需要,可申请聚合数据天气预报API:https://www.juhe.cn/docs/api/id/39,并生成AppKey. 接口地址:http://v.juhe.cn/weather/index ...
- Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)
1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/ Hadoop ...