复杂 Listview 显示 多个样式

三种方式

目前为止有三种方法让Listview现实多个样式

  • 最简单最常用的,通过addHeaderView或addFooterView,但是只能在首尾添加
  • 较麻烦但正规的方式,通过getViewTypeCount[View有多少个样式]和getItemViewType[这个View是哪个样式]方法设置
  • 较简单但不正规的方式,通过判断poison的值加载不同的布局,但这种方式可能有隐患[从代码中可以看出很不规范]

addHeaderView方式

  • 当listview需要添加headerview时,可以通过调用listview的addHeaderView(headView)或addHeaderView(headView, null, false) 方法,后一个可以控制header是否可以被selected
  • addHeaderView方法必须放在listview.setAdapter前面,否则会报错。原因是调用setAdapter方法时会判断是否已经添加header,如果已经添加则会生成一个新的tempAdapter,这个新的tempAdapter包含我们设置的adapter所有内容(包含header和footer),所以当我们在给listview添加了header后在程序中调用listview.getAdapter时返回的是tempAdapter而不是我们通过setAdapter传进去的adapter。如果没有设置adapter则tempadapter与我们自己的adapter是一样的。
  • listview.getadapter().getcount()方法返回值会比我们预期的要大,原因是添加了header。

标准方式:

  • getViewTypeCount:返回的是你有几种类型的样式(返回不同布局的数目)
  • getItemViewType:返回值代表的是某一个样式的 Type(是一个需要我们自己定义的,用于区分不同样式的int类型的值),参数position所决定的的view的id

布局-样式

    

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#cfc"

android:orientation="horizontal"

android:padding="1dp" >

<ListView

android:id="@+id/lv1"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

android:descendantFocusability="afterDescendants"

android:listSelector="@android:color/transparent" />

<ListView

android:id="@+id/lv2"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_marginLeft="3dp"

android:layout_weight="1"

android:descendantFocusability="afterDescendants"

android:listSelector="@android:color/transparent" />

<ListView

android:id="@+id/lv3"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_marginLeft="3dp"

android:layout_weight="1"

android:descendantFocusability="afterDescendants"

android:listSelector="@android:color/transparent" />

</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="wrap_content"

android:background="#80f8"

android:gravity="clip_vertical" >

<TextView

android:id="@+id/holder1_title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:ellipsize="end"

android:padding="5dp"

android:singleLine="true"

android:text="大标题"

android:textColor="#f00"

android:textSize="15sp" />

</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="30dp"

android:background="#ffffff"

android:gravity="center_vertical"

android:orientation="horizontal" >

<ImageView

android:id="@+id/holder2_iv"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/ic_launcher" />

<TextView

android:id="@+id/holder2_title"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginLeft="5dp"

android:gravity="center_vertical"

android:text="小标题"

android:textColor="#00f"

android:textSize="13sp" />

</LinearLayout>

代码-Activity

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.ImageView;

import android.widget.AbsListView.LayoutParams;

import android.widget.ListView;

import android.widget.TextView;

import com.example.hjfg.R;

public class MainActivity extends Activity {

private ListView lv1;

private ListView lv2;

private ListView lv3;

private List<MyBean> mList1;

private List<ViewItem> mList2;

private List<MyBean> mList31;

private List<MyBean> mList32;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

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

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

initData1();

initData2();

initData3();

lv1.setAdapter(new MyAdapter1(this, mList1));//addHeaderView要放在setAdapter之前,而addFooterView放在前后都可以

lv2.setAdapter(new MyAdapter2(this, mList2));

lv3.setAdapter(new MyAdapter3(this, mList31, mList32));

}

private void initData1() {

mList1 = new ArrayList<MyBean>();

for (int i = 0; i < 20; i++) {

mList1.add(new MyBean(("包青天" + i), R.drawable.ic_launcher));

}

//给ListView添加头尾,其中Adapter不需任何改变

TextView mTextView = new TextView(this);

mTextView.setText("我是【先】添加的的头部");

mTextView.setBackgroundColor(0xff4EEE94);

ImageView mImageView = new ImageView(this);

mImageView.setImageResource(R.drawable.ic_launcher);

lv1.addHeaderView(mTextView);//添加以后,listView 的position = 0 的位置对应的是此mTextView,他和其他item是完全等价的

lv1.addHeaderView(mImageView);

lv1.setHeaderDividersEnabled(true);//控制头部是否显示分割线。默认为true

//最后加一个透明的控件,那么最后那条分割线【可能】就出来了

View footerView = new View(this);

LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, 50);

footerView.setBackgroundColor(0x00112233);//透明

footerView.setLayoutParams(layoutParams);

lv1.addFooterView(footerView);

}

private void initData2() {

mList2 = new ArrayList<ViewItem>();

for (int i = 0; i < 30; i++) {

ViewItem item;

if (i % 5 == 0 || i == 3) item = new ViewItem(0, "大标题 " + i);

else item = new ViewItem(1, "内容 " + i, R.drawable.ic_launcher);

mList2.add(item);

}

}

private void initData3() {

mList31 = new ArrayList<MyBean>();

mList32 = new ArrayList<MyBean>();

for (int i = 0; i < 18; i++) {

mList31.add(new MyBean(("包青天" + i), R.drawable.ic_launcher));

if (i < 12) mList32.add(new MyBean(("白乾涛" + i), R.drawable.icon));

}

}

}

代码-Adapter1

import java.util.List;

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 com.example.hjfg.R;

public class MyAdapter1 extends BaseAdapter {

private Context mContext;

private List<MyBean> mList;

private ViewHolder mViewHolder;

private MyBean mBean;

public MyAdapter1(Context context, List<MyBean> list) {

this.mContext = context;

this.mList = list;

}

@Override

public int getCount() {

return mList.size();

}

@Override

public Object getItem(int position) {

return mList.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

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

if (convertView != null) {

mViewHolder = (ViewHolder) convertView.getTag();

} else {

convertView = LayoutInflater.from(mContext).inflate(R.layout.item, null);

mViewHolder = new ViewHolder();

mViewHolder.iv_head = (ImageView) convertView.findViewById(R.id.holder2_iv);

mViewHolder.tv_name = (TextView) convertView.findViewById(R.id.holder2_title);

convertView.setTag(mViewHolder);

}

mBean = mList.get(position);

mViewHolder.iv_head.setImageResource(mBean.getId());

mViewHolder.tv_name.setText(mBean.getName());

return convertView;

}

public static class ViewHolder {

public ImageView iv_head;// 头像

public TextView tv_name;// 名字

}

}

代码-Adapter2

import java.util.List;

import android.content.Context;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

import com.example.hjfg.R;

public class MyAdapter2 extends BaseAdapter {

private Context context;

private List<ViewItem> mList;

private Holder1 holder1;

private Holder2 holder2;

public MyAdapter2(Context context, List<ViewItem> list) {

this.context = context;

mList = list;

}

//**********************************************************************************************************

@Override

public int getCount() {

return mList.size();

}

@Override

public Object getItem(int position) {

return mList.get(position);

}

//重写方法一:返回值代表的是某一个样式的 Type(是一个需要我们自己定义的,用于区分不同样式的int类型的值)

@Override

public int getItemViewType(int position) {

return mList.get(position).getType();

}

//重写方法一:返回的是你有几种类型的样式

@Override

public int getViewTypeCount() {

return 2;

}

@Override

public long getItemId(int paramInt) {

return paramInt;

}

@Override

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

int type = getItemViewType(position);

if (convertView == null) {

//选择某一个样式

switch (type) {

case ViewItem.ITEM_FIRST:

convertView = View.inflate(context, R.layout.head, null);

holder1 = new Holder1();

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

holder1.holder1_title.setText(mList.get(position).getTitle());

convertView.setTag(holder1);

break;

case ViewItem.ITEM_SECOND:

convertView = View.inflate(context, R.layout.item, null);

holder2 = new Holder2();

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

holder2.holder2_iv = (ImageView) convertView.findViewById(R.id.holder2_iv);

holder2.holder2_title.setText(mList.get(position).getTitle());

holder2.holder2_iv.setImageResource(mList.get(position).getId());

convertView.setTag(holder2);

break;

default:

break;

}

} else {

switch (type) {

case ViewItem.ITEM_FIRST:

holder1 = (Holder1) convertView.getTag();

holder1.holder1_title.setText(mList.get(position).getTitle());

break;

case ViewItem.ITEM_SECOND:

holder2 = (Holder2) convertView.getTag();

holder2.holder2_title.setText(mList.get(position).getTitle());

break;

default:

break;

}

}

return convertView;

}

//***********************************************************************************************************

//复用convertView

private class Holder1 {

TextView holder1_title;

}

private class Holder2 {

TextView holder2_title;

ImageView holder2_iv;

}

}

代码-Adapter3

import java.util.List;

import com.example.hjfg.R;

import android.content.Context;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

public class MyAdapter3 extends BaseAdapter {

private Context mContext;

private List<MyBean> mList1;

private List<MyBean> mList2;

private ViewHolder holder;

private MyBean mBean;

public MyAdapter3(Context context, List<MyBean> list1, List<MyBean> list2) {

mContext = context;

mList1 = list1;

mList2 = list2;

}

//************************************************************************************************************

@Override

public int getCount() {

return mList1.size() + 1 + mList2.size() + 1;

}

@Override

public Object getItem(int position) {

return null;

}

@Override

public long getItemId(int position) {

return 0;

}

@Override

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

//标题******************************************************************************************************

if (position == 0) {

View view = View.inflate(mContext, R.layout.head, null);

TextView tv = (TextView) view.findViewById(R.id.holder1_title);

tv.setText("包青天有" + mList1.size() + "个");

return view;

} else if (position == (mList1.size() + 1)) {

View view = View.inflate(mContext, R.layout.head, null);

TextView tv = (TextView) view.findViewById(R.id.holder1_title);

tv.setText("白乾涛有" + mList2.size() + "个");

return view;

}

//内容******************************************************************************************************

holder = new ViewHolder();//因为数据结构相同,所以可以共同利用缓存,否则只能单独利用缓存

if (position <= mList1.size()) {

int newposition = position - 1;

mBean = mList1.get(newposition);

} else if (position > mList1.size() + 1) {

int newposition = position - 1 - mList1.size() - 1;

mBean = mList2.get(newposition);

}

if (convertView != null && convertView instanceof RelativeLayout) { // 不仅需要检查是否为空,还要判断是否是合适的类型

holder = (ViewHolder) convertView.getTag();

} else {

convertView = View.inflate(mContext, R.layout.item, null);

holder = new ViewHolder();

holder.iv_icon = (ImageView) convertView.findViewById(R.id.holder2_iv);

holder.tv_name = (TextView) convertView.findViewById(R.id.holder2_title);

convertView.setTag(holder);

}

holder.iv_icon.setImageResource(mBean.getId());

holder.tv_name.setText(mBean.getName());

return convertView;

}

//*********************************************************************************************************

private static class ViewHolder {

TextView tv_name;

ImageView iv_icon;

}

}

代码-bean

public class MyBean {

private String name;

private int id;

public MyBean(String name, int id) {

this.name = name;

this.id = id;

}

public String getName() {

return name;

}

public int getId() {

return id;

}

}



// 封装每个条目的数据数据

public class ViewItem {

public static final int ITEM_FIRST = 0;//第一个样式

public static final int ITEM_SECOND = 1;//第二个样式

private int type;//记录是哪种样式

private String title;//标题

private int id;//图片,仅第二个样式可以获取图片

public ViewItem(int type, String str) {

this.type = type;

title = str;

}

public ViewItem(int type, String str, int id) {

this.type = type;

title = str;

this.id = id;

}

public String getTitle() {

return title;

}

public int getId() {

if (type == ITEM_SECOND) return id;

else throw new RuntimeException("哥们是大标题,没有ID");

}

public int getType() {

return type;

}

}

来自为知笔记(Wiz)

附件列表

时间: 2024-12-15 08:47:24

复杂 Listview 显示 多个样式的相关文章

ListView显示不同样式的item

先look图 我们再使用listview时,listview的item大多时候都是一种样式,在很多app中也很常见,但有时候根据需求,可能数据的数量不一样,同个类型的数据显示的位置不同,亦或者有的item需要图片,有的不需要,但是这些又必须在同一个listview中显示,这时我们就需要在listview中显示多种样式的item,首先我们需要考虑的是如何将不同数量的数据装载到ArrayList<~>中呢,先看看下面的listViewItem,. 1 package com.example.ker

Android下用程序的方法为ListView设置分割线Divider样式

使用XML的时候可以使用android:divider属性为ListView设置分割线的样式(颜色或者资源文件),而在Java代码中默认提供的方法 listView.setDivider() 却只支持Drawable资源文件,为此费了一点时间想解决方法,后来才发现其实很简单,android提供创建颜色资源文件的方法,于是只需要用 listView.setDivider(new ColorDrawable(color)) 就可以解决问题了. 如果设置完Divider没有效果的话,设置divider

自定义ScrollView 和ListView 显示问题

====================问题描述==================== 我用ScrollView 做了 阻尼特效,然后在里面加上ListView显示内容,启动程序的时候居然只显示ListView ,需要拖动屏幕才可以显示完整 ====================解决方案1==================== 布局设置问题. ====================解决方案2==================== 你上面的图片不是把空间给占了么? ===========

listview显示固定条数

看了很多网上其他大神的,感觉还是在listview的adapter中的getCount中下手比较好点 毕竟计算高度等等,那会让辅助的布局会一团糟,例如下面的搜索历史只显示四条,布局中有横向listview 有gridview package com.tfot.hotel.yichengyiyu.Activity.zhou_activity.adapter; import android.content.Context; import android.database.sqlite.SQLiteD

ListView显示Sqlite的数据美化版与性能优化

在上一篇文章中,我们已经实现在listview显示数据库内容的.但是我们listview中,排版不是很好看,所以这篇文章呢,我们来对listveiw进行美化.哈哈,说白了,就是对listview添加一个布局文件,然后把布局文件转化为view对象显示出来. 这里代码我们不贴全部,就贴上新增加的布局文件和有做修改的方法. 先看图片吧. 然后看listview的布局文件,其实从这个例子,大家可以知道,listview的项目可以显示很复杂的东西,只要是view对象都是可以显示的额,只要你的布局文件写好了

drupal中根据不同的内容类型节点显示不同的样式

在template.tpl中添加如下代码: function lee_preprocess_node(&$variables) { if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) { $variables['classes_array'][] = 'node-full'; } } 在template文件下建立模板文件node--article.tpl.php 最后清除下缓存即可!

Android 自定义 ListView 显示网络歌曲列表

本文内容 环境 项目结构 演示自定义 ListView 显示网络歌曲列表 参考资料 本文最开始看的一个国人的文章,没有源代码,根据文中提供的源代码,自己新建的项目(最可气的是,没有图标图片资源,只能自己乱编),但程序不是很稳定,有时能显示出列表中的缩略图,有时显示不出来,还在主线程访问了网络.后看文章评论,作者给出英文原文链接,本来想这下没事了吧,结果下载源代码运行后,还是有问题~仔细看英文原文,原来他也是根据 Github 上一个项目的基础上搞的,只是添加了式样,以及显示完整的歌曲列表,包括歌

28.悬浮窗、listview显示不同条目

APP管理界面 布局 用户程序那一行一直在最上面,拖动到系统程序时又显示系统多少个 <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/ll_loading" android:layout_width="fill_parent"

Android开发中ScollView嵌套ListView显示不全问题解决

大多数时候,我们用ListView来加载数据的页面不需要在ListView的外面再套上一个ScollView,因为ListView本身可以滚动显示数据.有时我们页面中除要用ListView显示列表数据之外还要显示其它数据,这时候就需要在整个页面最个层套上一个Scollview,否则显示就可能出现问题(比如在ListView上面已经有很多其它数据,显示在手机上直接导致ListView看不见了,这时就要在整个屏幕布局加ScollView实现滑动界面),用过ScollView嵌套ListView的朋友