Android:ListView底部footview无法显示问题解决
来源:互联网 发布:qt geant4 混合编程 编辑:程序博客网 时间:2024/05/21 15:40
前两天测试组反馈一个bug,列表(实质上是一个ListView)在OPPO R6手机上无法显示底部:ListView可以滑动,但是底部的选项框无法显示。
ListView用法科普
ListView相信很多人都使用过,甚至有些小伙伴都已经开始使用RecyclerView了,它经常用来做列表。基本用法如下:
ListView listView = findViewById(resId);BaseAdapter adapter = new MyBaseAdapter(Context, Arraylist);listView.setAdapter(adapter);adapter.notifyDataSetChanged();
但是如果需要在顶部/底部展示一个不同于其他item的view该怎么办呢?两种办法:
- 方法一:复写BaseAdapter的getItemViewType(int position);getViewTypeCount()两个方法,不具体展开,与本文无关。
- 方法二:使用ListView.addHeadView(headView),ListView.addFootView(footView)。用法如下:
ListView listView = findViewById(resId);BaseAdapter adapter = new MyBaseAdapter(Context, Arraylist);listView.setAdapter(adapter);View headView = (View) LayoutInflater.from(this).inflate(R.layout.headview, null);View footView = (View) LayoutInflater.from(this).inflate(R.layout.footview, null);listView.addHeadView(headView);listView.addFootView(footView);adapter.notifyDataSetChanged();
Demo效果如下图:
结果,我们的项目在OPPO R6手机上超出了一屏,只能滑动显示到最后一个normal item,却无法查看到底部的footView,其他手机上正常显示。Why???
纠结了一下,将以上方法二的代码修改如下:
ListView listView = findViewById(resId);BaseAdapter adapter = new MyBaseAdapter(Context, Arraylist);View headView = (View) LayoutInflater.from(this).inflate(R.layout.headview, null);View footView = (View) LayoutInflater.from(this).inflate(R.layout.footview, null);listView.addHeadView(headView);listView.addFootView(footView);listView.setAdapter(adapter);// 将设置适配器的操作延后adapter.notifyDataSetChanged();
一行代码的改动,OPPO R6上FootView神奇的显示出来了!!!
源码分析
请看ListView.setAdapter(adapter)部分源码:
... if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {// 如果headView的集合,或者footView的集合不为空,就进行Adapter转换 mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter); } else { mAdapter = adapter;// 没有执行添加头部和尾部的操作 } ...
请看ListView.addFootView(footView)部分源码;
... // Wrap the adapter if it wasn't already wrapped. if (mAdapter != null) {// 执行过了setAdapter(adapter) if (!(mAdapter instanceof HeaderViewListAdapter)) {// 如果Adapter没进行过转换,就转换 mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter); } ... }
由以上源码可以看出,无论是先添加FootView还是先setAdapter,mAdapter都会被转换成HeaderViewListAdapter,其中HeaderViewListAdapter和BaseAdapter一样,都是ListAdapter的实现类,是对BaseAdapter的二次封装。
我的推断
所以我推断,有可能是在OPPO的framework源码中,ListView.addFootView(footview)方法中,有可能是这样的:
... // Wrap the adapter if it wasn't already wrapped. if (mAdapter != null) {// 执行过了setAdapter(adapter) if (!(mAdapter instanceof HeaderViewListAdapter)) {// 如果Adapter没进行过转换,就转换 // mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);// 这行代码被人无意中注释或删除了 } ... }
不知道是否猜测正确,仅供参考。
解决办法
所以,解决ListView的底部在OPPO等手机上无法显示的办法就是,将setAdaper(adapter)操作放在addFootView(footview)之后进行。希望对大家有所帮助。
查看原文:http://blog.xiongit.com/2015/12/androidlistview%e5%ba%95%e9%83%a8footview%e6%97%a0%e6%b3%95%e6%98%be%e7%a4%ba%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/
- Android:ListView底部footview无法显示问题解决
- ListView添加footView不显示问题
- android listview添加footview,有的手机可以正常显示,有的则不显示
- 【Android】listview无法显示
- Android-ListView显示在最底部
- Android ListView显示底部的分割线
- [Android] ListView底部分割线显示问题
- android 使listview显示最底部一条
- ListView中headView和footView Android ListView的OnItemClickListener详解
- 给listView添加headView或footView不显示的问题
- listview add footview
- Android UI-ListView底部其他控件显示的小例子
- android控件ListView顶部或者底部也显示分割线
- Android开发 ListView底部分割线不显示的解决办法
- listview底部显示不全问题
- ListView的FootView和HeadView
- 关于listView下方软键盘弹出,listView无法压缩显示的问题解决方案
- Widgets无法显示问题解决
- R: 学习Gradient Boosting算法,提高预测模型准确率
- Linux下安装Apache httpd server
- 用外部物理路由器时使用Neutron dhcp-agent提供的metadata服务(by quqi99)
- POJ 1308 Is It A Tree?(并查集)
- 【数学/扩展欧几里得/Lucas定理】BZOJ 1951 :[Sdoi 2010]古代猪文
- Android:ListView底部footview无法显示问题解决
- mqtt协议理解(结合libemqtt,subscribe部分)
- ViewPager+Fragment
- Java获取客户端的IP地址
- 微信分享接口
- [置顶] IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget
- java 运算符
- ASP.NET MVC4 用户登录验证
- poj 1182 食物链