安卓RecylerView嵌套和事件处理
最近遇到了一个需求:RecylerView的某一项为listView,即listView嵌套,且要求内部ListView可以滑动,高度固定。

如果直接简单的写完,会发现有两个问题:
1.内部listView高度显示一行
2.内部listview无法进行滑动
以上两个问题可以用以下方法加以解决:
针对问题1:
解决方法1:在Adapter里面的onCreateViewHolder()方法里面加入以下方法,动态的设置该Item的高度。
private void setListViewHeightBasedOnChildren(ListView listview){
int totalHeight=0;
for(int i=0,len=myListAdapter.getCount();i<len;i++){
View listItem=myListAdapter.getView(i,null,listview);
listItem.measure(0,0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params=listview.getLayoutParams();
params.height=totalHeight + listview.getDividerHeight() * myListAdapter.getCount();
listview.setLayoutParams(params);
}
上面代码设置内部ListView的高度为其实际高度,如果有需求高度固定,则可以修改代码,将totalHeight改为固定值即可,此处可以很灵活的设置。
解决方法2:方法1可以解决大部分问题,但是在我的项目中有个特殊的问题,即内部listview的item为textView,其中的文字个数是变化的,行数不定,在这种情况下,用getMeasuredHeight是无法获得多行情况下的textview实际高度的。这种情况下可以采用方法2,即:让内部listView继承自自定义ViewAutoHeightListView,具体代码如下:
public class AutoHeightListView extends ListView {
public AutoHeightListView(Context context) {
super(context);
}
public AutoHeightListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AutoHeightListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
关键代码为复写onMeasure方法,将HeightMeasureSpec修改一下。原理墙裂推荐 http://www.cnblogs.com/xyhuangjinfu/p/5435201.html 原理简单概括以下就是,父类传递给Listview的高度测量模式默认为unSpecified,且在该模式下其计算自身高度为第一个子view的高度。上面代码将其修改为at_most模式,在该模式下其自身高度的计算为计算所有子View高度和。
针对问题2:
原因在于ListView类似于ScrollView,两个嵌套的情况下,外部ListView会把用户的操作消费掉,无法传递分发给内部ListView,解决方法就从此处入手:将外部ListView改成自定义View,继承ListView并重写onIntercept()方法,将其返回值改为false,即外部listview不拦截触摸事件。
public class ParentRecylerView extends RecyclerView {
public ParentRecylerView(Context context) {
super(context);
}
public ParentRecylerView(Context context, AttributeSet attrs, int defStyle){
super(context,attrs,defStyle);
}
public ParentRecylerView(Context context, AttributeSet attrs){
super(context,attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}
经过以上两个设置,就可以实现本文提出的需求了。
安卓RecylerView嵌套和事件处理的更多相关文章
- 三层ViewPager嵌套 的事件处理
这么多ViewPager嵌套在一起肯定会遇到冲突 不信你试试(笑脸) 下面来说怎么解决.....太为难我这个菜b了 设置外部的父控件不要拦截我子控件的事件,通过重写ViewPager的 @Overri ...
- Unexpected namespace prefix "xmlns" found for tag Linear Layout
原文地址http://blog.csdn.net/taxuexumei/article/details/41523419 今天遇到的问题,,,保存到博客里,下回遇到找博客就行了,,,,,, 今天在制作 ...
- iscroll在谷歌浏览器中bug
https://segmentfault.com/q/1010000008489619 iscroll 在安卓app嵌套html页面时,导致列表页滑动不起来,并且在chorme浏览器中使用手机模式,也 ...
- 安卓开发笔记(十):升级ListView为RecylerView的使用
概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活.Recycle ...
- [RN] React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示
React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示 问题: 0.9.0 或 0.8.0 版本的 ...
- 慕课网-安卓工程师初养成-4-4 Java条件语句之嵌套 if
来源:http://www.imooc.com/code/1356 嵌套 if 语句,只有当外层 if 的条件成立时,才会判断内层 if 的条件.例如,活动计划的安排,如果今天是工作日,则去上班,如果 ...
- 安卓开发ScrollView嵌套ListView只显示一行
在用列表控件做一个“更多功能”的界面的时候 <?xml version="1.0" encoding="utf-8"?> <ScrollVie ...
- Linux及安卓的事件处理资料
事件处理机制介绍: https://source.android.com/devices/input/overview.html http://newandroidbook.com/Book/Inpu ...
- Android 在ListView中嵌套ListView的事件处理
前天在工作中遇到在ListView中的Item需要用ListView来展现处理后的内容,然后就遇到了一个很头疼的问题,作为Item的ListView没法进行滑动,而且显示也不正常,只是显示几个子Ite ...
随机推荐
- 阮一峰:自适应网页设计(Responsive Web Design)别名(响应式web设计)
随着3G的普及,越来越多的人使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通 ...
- c++刷题(24/100)正则匹配与位运算
题目1:正则表达式匹配 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字 ...
- 解决windows文件夹不能自动刷新的问题
我用的是win7系统,最近忽然发现我的文档文件夹里的文件不能自动刷新了,就是当剪切或删除某个文件后,文件夹里的文件没有变化,看起来文件还在原文件夹中,只有通过手动刷新后才能看到效果,该如何解决? 网上 ...
- Vue项目按需打包Lodash
使用的是 webpack 模板 1. 首先安装 npm install lodash --save npm install lodash-webpack-plugin babel-plugin-lod ...
- go 切片练习
下列程序输出什么? package main import "fmt" func main() { var sa = make([]string, 5, 10) f ...
- docker 错误排查:无法进入容器.
docker 错误排查:无法进入容器. #docker exec -it 3c1d bash rpc error: code = 2 desc = oci runtime error: exec fa ...
- SPOJ 16549 - QTREE6 - Query on a tree VI 「一种维护树上颜色连通块的操作」
题意 有操作 $0$ $u$:询问有多少个节点 $v$ 满足路径 $u$ 到 $v$ 上所有节点(包括)都拥有相同的颜色$1$ $u$:翻转 $u$ 的颜色 题解 直接用一个 $LCT$ 去暴力删边连 ...
- HDU 2825 Wireless Password
题目链接:HDU-2825 题意:给出m个单词,要构造出满足包含其中大于等于k个单词的字符串,字符只包括小写字母,问长度为n的这样的串有多少个. 思路:令dp[i][j][k]表示当前已经构造了i个字 ...
- 教你用DrawLayout 实现Android 侧滑菜单
现在的APP越来越注重用户体验,百度视频客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示.类似的还有天天动听,人 ...
- poj3636
题意:每个物品有两个属性:长和宽(长宽不可互换).如果一个物品的长和宽均大于另一个物品,则这个物品可以罩住另一个物品,用这种罩住物品的方法将物品分组,一组之内的物品可以一个罩住一个的全部罩起来.问最少 ...