ListView-添加head跟foot item 问题
今天在使用ListView 的 addFooterView 的方法时候,遇到了一个问题。当我代码中执行了如下的操作
ListView listView = new ListView(this);
listView.addFooterView(mItem);
listview.setAdapter(mAdapter);
listview.getAdapter();
得到的adapter一直报错,说是类转化错误。后来通过看ListView源码发现了问题所在。
我们看一下addFooterView方法
public void addFooterView(View v, Object data, boolean isSelectable) {
final FixedViewInfo info = new FixedViewInfo();
info.view = v;
info.data = data;
info.isSelectable = isSelectable;
mFooterViewInfos.add(info);
mAreAllItemsSelectable &= isSelectable; // Wrap the adapter if it wasn't already wrapped.
if (mAdapter != null) {
if (!(mAdapter instanceof HeaderViewListAdapter)) {
mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
} // In the case of re-adding a footer view, or adding one later on,
// we need to notify the observer.
if (mDataSetObserver != null) {
mDataSetObserver.onChanged();
}
}
}
我们看到当我们使用这个方法的时候,其他会把adapter重新创建成为HeaderViewListAdapter,当我们再次得到adapter的时候,它其实已经不是你set 进去的adapter了
网上有好多人说,我们只需要在listview.setAdapter()方法之前使用addFooter方法就可以避免这个问题。我尝试了这种方法,结果还是一样的结果。也就是说,无论你在setAdapter()前后使用这个方法
,对adapter的影响都是一样的,因为我们通过看ListView的setAdapter方法就知道原因了
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
} else {
mAdapter = adapter;
}
我们看到setAdapter里面有上面这句代码。这就说明了,我们无论在哪里使用addFooter方法,其实都会更改adapter
现在我们可以在看看,HeaderViewListAdapter是一个什么东西
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;
。。。。。。。。。。。。。。。。
它其实也是一个adapter,只不过它里面保存了listview的adapter跟head、foot信息。这样,如果我们想得到当初我们赋给listview的adapter的话,可以考虑从它里面得到。
另外一点需要注意,当我们通过listview.getAdapter()得到adapter的时候,然后通过adapter.getCount的方法得到的item数,是包含了head跟foot的。看下HeaderViewListAdapter 中
getcount方法
public int getCount() {
if (mAdapter != null) {
return getFootersCount() + getHeadersCount() + mAdapter.getCount();
} else {
return getFootersCount() + getHeadersCount();
}
}
如果我们想要使用listview.getAdapter()得到我们当初传入的纯净adapter,可以使用如下方法
Adapter a = listView.getAdapter();
ConversationListAdapter adapter = null;
if (a instanceof HeaderViewListAdapter) {
adapter = (ConversationListAdapter) ((HeaderViewListAdapter) a).getWrappedAdapter();
} else if (a instanceof ConversationListAdapter) {
adapter = (ConversationListAdapter) a;
} else {
android.util.Log.e("zhangshuli", "a=="+a);
}
也就是通过instanceof方法,判断我们得到的adapter是原来的,还是被listview改造过的。其中getWrappedAdapter是HeaderViewListAdapter提供的方法,获得的就是纯净adapter
ListView-添加head跟foot item 问题的更多相关文章
- 为ListView添加头和脚
转自:https://software.intel.com/zh-cn/blogs/2014/12/15/android-listview-addheaderview-addfooterview ...
- 自定义listView添加滑动删除功能
今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...
- ListView添加图片文字项
1)listview 控件 结合 imagelist 控件 实现类似效果. 2)添加 imagelist 控件 images 属性,点击后面的... 添加相应图片. 3)点listview,查看其属性 ...
- Android之listview添加数据篇
一.ListView: 1. ListView通常有两个职责: 1.向布局填充数据 2.处理选择点击等操作 2.ListView的创建需要3个元素: 1. ListView中的每一列的View. 2. ...
- 仿喜马拉雅实现ListView添加头布局和脚布局
ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...
- listview当选中某一个item时设置背景色其他的不变
listview当选中某一个item时设置背景色其他的不变: 可以使用listview.setOnFoucsChangeListener(listener) ; /** * listview获得焦点和 ...
- ListView添加项目带序列
ListView添加项目带序列 function AddSelItems(listview1:TListView;ListView2:TListView):Boolean;var s: st ...
- Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item
1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...
- Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)
1 MainActivity.java package com.myadapter; import java.util.ArrayList; import java.util.HashMap; ...
- ListView添加节点
ListView插入节点的流程 当ListView控件的样式被设置成report时,ListView控件实际上是分为两个部分, 一部分是Column, 这个部分是用来显示ListView的每一列的标题 ...
随机推荐
- django 笔记6 Ajax
感谢alex~ .Django请求生命周期 输入url 进入 urls(路由系统) 指向 views(视图函数)->(获取模板) 里面的函数 再由函数返回字符串给用户 .路由系统 /index/ ...
- webService接口发布失败问题
今天在原有工程上新增加了个webService接口的服务类,但是总提示 axis2 出错 File "/axis2-web/listSingleService.jsp" not f ...
- [BJWC2012]冻结 分层图最短路
昨晚飞行路线之后,这道题就应该能一眼切了 题目当然也不难,跑一遍分层图最短路即可 Code: #include<cstring> #include<algorithm> #in ...
- 超链接:a标签
a标签的功能:实现跳转功能 a标签的重要属性:href,target href的值为跳转目标的地址,如果是跳转页面的话,需要这个页面的超链接. target的值有四个:_blank._self._pa ...
- Python3 利用POP3与smtplib进行计算机远程控制
初习,代码有不足之处,欢迎指出. 跟大家分享的是,通过发送端发送cmd命令,从而对接收端进行cmd命令的控制. #接收端代码 from poplib import POP3 import time,o ...
- Ubuntu上使用过的命令,Linux常用命令,mount 硬盘挂载, ls 列表list命令,cp 复制copy命令,mkdir 创建文件夹 ,nano 编辑器,cat 文档合并,chmod 文件权限,ssh win10连接ubuntu服务器的步骤
man 帮助 > man ls # ubuntu的帮助 tar.gz 压缩解压 > tar -zcvf yzn.tar.gz /home/yzn # 压缩 > tar -zxvf y ...
- 【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) B】Recursive Queries
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个记忆化搜索. 接近O(n)的复杂度吧 [代码] #include <bits/stdc++.h> using nam ...
- c#+ArcGIS Engine-获取矢量图层的空间参考
转自原文c#+ArcGIS Engine-获取矢量图层的空间参考 介绍一种简单的获取矢量图层空间参考的方法: 首先打开Shp文件获得FeatureClass,代码如下: string pPath=&q ...
- ArcGIS api for javascript——查找任务-在地图上查找要素
描述 本例展示了如何使用查找任务搜索数据.本例在地图上用图表显示结果并用DojoX的grid格式化结果为表格样式. FindTask构造函数需要一个ArcGIS Server地图服务的URL.本例使用 ...
- CAShapeLayer的简单介绍以及基本使用
1.CAShapeLayer简单介绍 1.1CAShapeLayer继承于CALayer,能够使用CALayer的全部属性值: 1.2CAShapeLayer须要贝塞尔曲线配合使用才有意义(也 ...