android HeaderViewListAdapter的介绍

public class

HeaderViewListAdapter

extends Object

implements Filterable WrapperListAdapter

Class Overview

ListAdapter used when a ListView has header views. This ListAdapter wraps another one and

also keeps track of the header views and their associated data objects.

This is intended as a base class; you will probably not need to use this class directly in your own code.

HeaderViewListAdapter的主要作用就是在ListAdapter基础上封装和升级,为其提供了添加列表头和列表尾的功能。

该类一般不直接使用,它的主要目的是为我们提供一个对包含列表头和列表尾的列表进行适配的一个基类。

构造函数如下:

Public Constructors
HeaderViewListAdapter(ArrayList<ListView.FixedViewInfo>
headerViewInfos, ArrayList<ListView.FixedViewInfo>
footerViewInfos, ListAdapter adapter)

参数

headerViewInfos 用于提供列表头

footerViewInfos   用于提供列表尾

adapter       用于为列表正文进行适配

另外,ListView.FixedViewInfo其实很简单,它就是对一个View及其信息的封装。

Fields
public Object data The data backing the view.
public boolean isSelectable true if the fixed view should be selectable in the list
public View view The view to add to the list
Public Constructors
ListView.FixedViewInfo()

HeaderViewListAdapter源码如下

HeaderViewListAdapter.java文件

/*

* Copyright (C) 2006 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

*      http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

package android.widget;

import android.database.DataSetObserver;

import android.view.View;

import android.view.ViewGroup;

import java.util.ArrayList;

/**

* ListAdapter used when a ListView has header views. This ListAdapter

* wraps another one and also keeps track of the header views and their

* associated data objects.

*<p>This is intended as a base class; you will probably not need to

* use this class directly in your own code.

*/

public class HeaderViewListAdapter implements WrapperListAdapter, Filterable {

private final ListAdapter mAdapter;

// These two ArrayList are assumed to NOT be null.

// They are indeed created when declared in ListView and then shared.

ArrayList<ListView.FixedViewInfo> mHeaderViewInfos;

ArrayList<ListView.FixedViewInfo> mFooterViewInfos;

// Used as a placeholder in case the provided info views are indeed null.

// Currently only used by some CTS tests, which may be removed.

static final ArrayList<ListView.FixedViewInfo> EMPTY_INFO_LIST =

new ArrayList<ListView.FixedViewInfo>();

boolean mAreAllFixedViewsSelectable;

private final boolean mIsFilterable;

public HeaderViewListAdapter(ArrayList<ListView.FixedViewInfo> headerViewInfos,

ArrayList<ListView.FixedViewInfo> footerViewInfos,

ListAdapter adapter) {

mAdapter = adapter;

mIsFilterable = adapter instanceof Filterable;

if (headerViewInfos == null) {

mHeaderViewInfos = EMPTY_INFO_LIST;

} else {

mHeaderViewInfos = headerViewInfos;

}

if (footerViewInfos == null) {

mFooterViewInfos = EMPTY_INFO_LIST;

} else {

mFooterViewInfos = footerViewInfos;

}

mAreAllFixedViewsSelectable =

areAllListInfosSelectable(mHeaderViewInfos)

&& areAllListInfosSelectable(mFooterViewInfos);

}

public int getHeadersCount() {

return mHeaderViewInfos.size();

}

public int getFootersCount() {

return mFooterViewInfos.size();

}

public boolean isEmpty() {

return mAdapter == null || mAdapter.isEmpty();

}

private boolean areAllListInfosSelectable(ArrayList<ListView.FixedViewInfo> infos) {

if (infos != null) {

for (ListView.FixedViewInfo info : infos) {

if (!info.isSelectable) {

return false;

}

}

}

return true;

}

public boolean removeHeader(View v) {

for (int i = 0; i < mHeaderViewInfos.size(); i++) {

ListView.FixedViewInfo info = mHeaderViewInfos.get(i);

if (info.view == v) {

mHeaderViewInfos.remove(i);

mAreAllFixedViewsSelectable =

areAllListInfosSelectable(mHeaderViewInfos)

&& areAllListInfosSelectable(mFooterViewInfos);

return true;

}

}

return false;

}

public boolean removeFooter(View v) {

for (int i = 0; i < mFooterViewInfos.size(); i++) {

ListView.FixedViewInfo info = mFooterViewInfos.get(i);

if (info.view == v) {

mFooterViewInfos.remove(i);

mAreAllFixedViewsSelectable =

areAllListInfosSelectable(mHeaderViewInfos)

&& areAllListInfosSelectable(mFooterViewInfos);

return true;

}

}

return false;

}

public int getCount() {

if (mAdapter != null) {

return getFootersCount() + getHeadersCount() + mAdapter.getCount();

} else {

return getFootersCount() + getHeadersCount();

}

}

public boolean areAllItemsEnabled() {

if (mAdapter != null) {

return mAreAllFixedViewsSelectable && mAdapter.areAllItemsEnabled();

} else {

return true;

}

}

public boolean isEnabled(int position) {

// Header (negative positions will throw an ArrayIndexOutOfBoundsException)

int numHeaders = getHeadersCount();

if (position < numHeaders) {

return mHeaderViewInfos.get(position).isSelectable;

}

// Adapter

final int adjPosition = position - numHeaders;

int adapterCount = 0;

if (mAdapter != null) {

adapterCount = mAdapter.getCount();

if (adjPosition < adapterCount) {

return mAdapter.isEnabled(adjPosition);

}

}

// Footer (off-limits positions will throw an ArrayIndexOutOfBoundsException)

return mFooterViewInfos.get(adjPosition - adapterCount).isSelectable;

}

public Object getItem(int position) {

// Header (negative positions will throw an ArrayIndexOutOfBoundsException)

int numHeaders = getHeadersCount();

if (position < numHeaders) {

return mHeaderViewInfos.get(position).data;

}

// Adapter

final int adjPosition = position - numHeaders;

int adapterCount = 0;

if (mAdapter != null) {

adapterCount = mAdapter.getCount();

if (adjPosition < adapterCount) {

return mAdapter.getItem(adjPosition);

}

}

// Footer (off-limits positions will throw an ArrayIndexOutOfBoundsException)

return mFooterViewInfos.get(adjPosition - adapterCount).data;

}

public long getItemId(int position) {

int numHeaders = getHeadersCount();

if (mAdapter != null && position >= numHeaders) {

int adjPosition = position - numHeaders;

int adapterCount = mAdapter.getCount();

if (adjPosition < adapterCount) {

return mAdapter.getItemId(adjPosition);

}

}

return -1;

}

public boolean hasStableIds() {

if (mAdapter != null) {

return mAdapter.hasStableIds();

}

return false;

}

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

// Header (negative positions will throw an ArrayIndexOutOfBoundsException)

int numHeaders = getHeadersCount();

if (position < numHeaders) {

return mHeaderViewInfos.get(position).view;

}

// Adapter

final int adjPosition = position - numHeaders;

int adapterCount = 0;

if (mAdapter != null) {

adapterCount = mAdapter.getCount();

if (adjPosition < adapterCount) {

return mAdapter.getView(adjPosition, convertView, parent);

}

}

// Footer (off-limits positions will throw an ArrayIndexOutOfBoundsException)

return mFooterViewInfos.get(adjPosition - adapterCount).view;

}

public int getItemViewType(int position) {

int numHeaders = getHeadersCount();

if (mAdapter != null && position >= numHeaders) {

int adjPosition = position - numHeaders;

int adapterCount = mAdapter.getCount();

if (adjPosition < adapterCount) {

return mAdapter.getItemViewType(adjPosition);

}

}

return AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;

}

public int getViewTypeCount() {

if (mAdapter != null) {

return mAdapter.getViewTypeCount();

}

return 1;

}

public void registerDataSetObserver(DataSetObserver observer) {

if (mAdapter != null) {

mAdapter.registerDataSetObserver(observer);

}

}

public void unregisterDataSetObserver(DataSetObserver observer) {

if (mAdapter != null) {

mAdapter.unregisterDataSetObserver(observer);

}

}

public Filter getFilter() {

if (mIsFilterable) {

return ((Filterable) mAdapter).getFilter();

}

return null;

}

public ListAdapter getWrappedAdapter() {

return mAdapter;

}

}

时间: 2024-09-30 06:26:35

android HeaderViewListAdapter的介绍的相关文章

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

我的Android第三章:Android的组件介绍

小编摘录了Android文档介绍Android四大组件的基本内容,感觉文档的内容写的很详细所以小编将它写入了博客 Android 使用Java语言开发.Android SDK 工具编译代码-以及任意数据并连同相关资源打包进一个Android 包内,它是一个以.apk 为后缀的压缩文件. 一个 .apk 文件中的 所有代码就是一个程序.这个.apk文件就用于在Android设备上安装这个程序. 一旦安装成功,这个Android程序就拥有了自己独立的运行沙盒(沙盒是在受限的安全环境中运行应用程序的一

Android控件介绍

Android控件介绍 多选按钮(CheckBox) CheckBox有两个常用的事件,OnClickListener事件和OnClickChangeListener事件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w

转android intent action 介绍大全

一些常用的Intent: Uri Action 功能 备注 geo:latitude,longitude Intent.ACTION_VIEW 打开地图应用程序并显示指定的经纬度   geo:0,0?q=street+address Intent.ACTION_VIEW 打开地图应用程序并显示指定的地址   http://web_address Intent.ACTION_VIEW 打开浏览器程序并显示指定的URL   https://web_address Intent.ACTION_VIEW

Android NDK 简单介绍、工具安装、环境配置

NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一起打包成apk.这些工具对开发人员的帮助是巨大的. * NDK集成了交叉编译器,并提供了对应的mk文件隔离平台.CPU.API等差异,开发者仅仅须要简单改动mk文件(指出"哪些文件须要编译"."编译特性要求"等),就能够创建出so. * NDK能够自己主动地将so和Ja

Android Fragment的介绍与使用(案例Demo)

应用场景: 众所了解Android上的界面展示都是通过Activity实现的,但是Activity也有它的局限性,同样的界面在手机上显示可能很好看,在平板上就未必了.为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局.Fragment通常是嵌套在Activity中使用的.首先需要注意,Fragment是在3.0版本引入的,如果你使用的是3.0之前的系统,需要先导入android-supp

Android Fragment 基本介绍

Android Fragment 基本介绍 Fragment Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块. 可以把Fragment设计成可以在多个Activity中复用的模块. 当开发的应用程序同时适用于平板电脑和手机时,可以利用Fragment实现灵活的布局,改善

Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查) 2014年2月21日 Android通讯录管理总结 这几天导师安排我一个任务就是研究一下Android通讯录获取联系人.通话记录.短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情.Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系.下面是本人查询资料总结的一下知识点,方便童鞋们以后用到. http://xys2891

Android 电话系统框架介绍

在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1.Solicited Response:Ap向Bp发送请求,Bp给Ap发送回复,该类型的AT指令及其回调函数以数组的形式存放在Ril_commands.h文件中: {数组中的索引号,请求回调函数,响应回调函数} [plain] view plaincopy {0, NULL, NULL},                   //no