最近遇到了一个需求: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嵌套和事件处理的更多相关文章

  1. 三层ViewPager嵌套 的事件处理

    这么多ViewPager嵌套在一起肯定会遇到冲突 不信你试试(笑脸) 下面来说怎么解决.....太为难我这个菜b了 设置外部的父控件不要拦截我子控件的事件,通过重写ViewPager的 @Overri ...

  2. Unexpected namespace prefix "xmlns" found for tag Linear Layout

    原文地址http://blog.csdn.net/taxuexumei/article/details/41523419 今天遇到的问题,,,保存到博客里,下回遇到找博客就行了,,,,,, 今天在制作 ...

  3. iscroll在谷歌浏览器中bug

    https://segmentfault.com/q/1010000008489619 iscroll 在安卓app嵌套html页面时,导致列表页滑动不起来,并且在chorme浏览器中使用手机模式,也 ...

  4. 安卓开发笔记(十):升级ListView为RecylerView的使用

    概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活.Recycle ...

  5. [RN] React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示

    React Native中使用 react-native-scrollable-tab-view嵌套在ScrollView里,导致 子内容 在安卓上无法显示 问题: 0.9.0 或 0.8.0 版本的 ...

  6. 慕课网-安卓工程师初养成-4-4 Java条件语句之嵌套 if

    来源:http://www.imooc.com/code/1356 嵌套 if 语句,只有当外层 if 的条件成立时,才会判断内层 if 的条件.例如,活动计划的安排,如果今天是工作日,则去上班,如果 ...

  7. 安卓开发ScrollView嵌套ListView只显示一行

    在用列表控件做一个“更多功能”的界面的时候 <?xml version="1.0" encoding="utf-8"?> <ScrollVie ...

  8. Linux及安卓的事件处理资料

    事件处理机制介绍: https://source.android.com/devices/input/overview.html http://newandroidbook.com/Book/Inpu ...

  9. Android 在ListView中嵌套ListView的事件处理

    前天在工作中遇到在ListView中的Item需要用ListView来展现处理后的内容,然后就遇到了一个很头疼的问题,作为Item的ListView没法进行滑动,而且显示也不正常,只是显示几个子Ite ...

随机推荐

  1. What is an intuitive explanation of the relation between PCA and SVD?

    What is an intuitive explanation of the relation between PCA and SVD? 36 FOLLOWERS Last asked: 30 Se ...

  2. Java SSM框架之MyBatis3(三)Mybatis分页插件PageHelper

    引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select ...

  3. CSS命名方法(笔记)

    划分CSS的一些方法(不同的划分方法都有利与弊,要记住,最合适项目的才是最好的): ①按功能划分:将字体的CSS存放在font.css.将控制颜色的CSS存放在color.css.将控制布局的CSS存 ...

  4. java 去除末尾的零 如果小数点可以去除同时去除小数点

    String s; if(s.indexOf(".") > 0){ //正则表达 s = s.replaceAll("0+?$", "" ...

  5. codeforces997C Sky full of stars

    传送门:http://codeforces.com/problemset/problem/997/C [题解] 注意在把$i=0$或$j=0$分开考虑的时候,3上面的指数应该是$n(n-j)+j$ 至 ...

  6. HDU 6205 (模拟) card card card

    题目链接 Problem Description As a fan of Doudizhu, WYJ likes collecting playing cards very much. One day ...

  7. Python练习-sys.argv的无聊用法

    代码如下: # 编辑者:闫龙 #将三次登陆锁定的作业改为: # python login.py -u alex -p 123456 输入的形式 # (-u,-p是固定的,分别代表用户名和密码) imp ...

  8. yii验证系统学习记录,基于yiicms(一)写的太长了,再写一篇(二)

    项目地址:https://gitee.com/templi/yiicms 感谢七觞酒大神的付出,和免费分享.当然也感谢yii2的开发团队们. 项目已经安全完毕,不知道后台密码,这种背景下,后台无法进去 ...

  9. c++ static静态

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  10. 动态获取UILabel的bounds

    在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度 CGSize labelBounds = [s ...