安卓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 ...
随机推荐
- java并发实践笔记
底层的并发功能与并发语义不存在一一对应的关系.同步和条件等底层机制在实现应用层协议与策略须始终保持一致.(需要设计级别策略.----底层机制与设计级策略不一致问题). 简介 1.并发简史.(资源利用率 ...
- 推荐一些我所用的firefox 附加组件。
firefox之所以强大,很大程度上是因为它有着超多的扩展组件,来实现许多有趣的功能.这几天把我装的firefox附加组件整理下,个人认为是一般上网常用或者可以说是必备的组件,o(∩_∩)o ,晒晒. ...
- ConcrrentSkipListMap介绍和原理分析
一.前言: JDK为我们提供了很多Map接口的实现,使得我们可以方便地处理Key-Value的数据结构. 当我们希望快速存取<Key, Value>键值对时我们可以使用HashMap. 当 ...
- 2017 jq 总结
$(el).parent() 获取父级元素 .parents('th') 获取祖元素th .parentsUntil("th") 找到 ...
- [转]边框回归(Bounding Box Regression)详解
https://blog.csdn.net/zijin0802034/article/details/77685438 Bounding-Box regression 最近一直看检测有关的Paper, ...
- 20165320 预备作业3 :Linux安装及命令入门
一.VirtualBox与Linux的安装 我是按照老师给的链接下的最新版本的VirtualBox5.26,然后Ubuntu软件(版本是16.04,最新的是17)是自己在网上找的旧版本下好的,因为我在 ...
- WCF REST 工作总结
首先引用System.ServiceModel;System.ServiceModel;System.ServiceModel.Activation;命名空间 [ServiceContract] pu ...
- 终端多窗口分屏Terminator
1.安装 Terminator最大的特点就是可以在一个窗口中打开多个终端 sudo apt-get install terminator 2.快捷键 Ctrl+Shift+E 垂直分割窗口 Ctrl+ ...
- java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)
本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容 1.xml解析的含义 2.XML的解析方式 3.xml的解析工具 4.XML的解析原理 5.实例 6 ...
- Git系统学习网址
https://code.csdn.net/help/CSDN_Code/progit/zh/07-customizing-git/01-chapter7