ScrollView嵌套ListView滑动冲突的解决方法
scrollview和listview这两个控件想必大家都不会陌生,但是这两者嵌套使用的时候就会出现麻烦。比如,我们如果想在listview下面添加其他的布局或者控件,然后想让它们作为一个整体都可以滑动的话,最常想到的就是用一个scrollview把它们包裹起来。想法似乎很美好,但是现实就有点残酷了。我们可以写一个小例子体验一下。
首先创建一个activity,在它的布局文件上放置一个listview:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.lin.mr.mystudy.scrollview.testactivity"> <listview android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content"> </listview> </linearlayout>
然后在代码中使用for循环生成一些数据,并使用arrayadapter适配数据。这里允许我偷一下懒,listview的item布局直接使用android提供的r.layout.simple_list_item_1,而没有自己去自定义。
public class testactivity extends activity { private listview listview; private arraylist<string> list; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_test); listview = (listview) findviewbyid(r.id.listview); findviewbyid(r.id.ll_container); list = new arraylist<>(); //生成需要显示到listview中的数据 for (int i = 0; i < 30; i++) { list.add("这是数据"+i); } //使用arrayadapter适配数据 listview.setadapter(new arrayadapter<string>(this, android.r.layout.simple_list_item_1,list)); } }
确保你当前的activity为启动activity,然后运行app,可以看到如下的效果:
好,看起来没有问题,但是如果这时我们需要在这个listview的头部或者底部添加一些控件,然后让它们整体都可以滑动呢?我们可以先这样试试:
<?xml version="1.0" encoding="utf-8"?> <scrollview xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.lin.mr.mystudy.scrollview.testactivity"> <linearlayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <listview android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content"> </listview> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮一" /> <button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮二" /> </linearlayout> </scrollview>
在listview的头部和底部加了几个控件,然后把所有的控件都用一个线性布局包裹起来,再把最外层的布局改为scrollview,再次运行,麻烦出现了:
天!我们的listview只剩下小小的一行了!试着滑动一下,发现滑动是没有问题的,就是只能显示一行。那我们该怎么办呢?
别着急,有一个简单的方法可以起死回生。我们可以自定义一个listview:
/** * 自定义listview */ public class mylistview extends listview { public mylistview(context context) { super(context); } public mylistview(context context, attributeset attrs) { super(context, attrs); } public mylistview(context context, attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { heightmeasurespec = measurespec.makemeasurespec(integer.max_value>>2,//右移运算符,相当于除于4 measurespec.at_most);//测量模式取最大值 super.onmeasure(widthmeasurespec,heightmeasurespec);//重新测量高度 } }
在这个listview中我们重写了onmeasure方法,然后重新定义heightmeasurespec参数,它的大小取最大值的四分之一(一般的做法),测量模式取最大值,然后调用父类的构造方法重新传入heightmeasurespec参数。这些步骤是为了保证listview的高度不出现问题。完成后,我们在布局文件中使用自定义的listview:
<?xml version="1.0" encoding="utf-8"?> <scrollview xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.lin.mr.mystudy.scrollview.testactivity"> <linearlayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <com.lin.mr.mystudy.scrollview.mylistview android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content"> </com.lin.mr.mystudy.scrollview.mylistview> <button android:layout_margin="4dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮一" /> <button android:layout_margin="4dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮二" /> </linearlayout> </scrollview>
运行之后,发现问题解决了!listview可以完整地显示,而且也可以滑动到头部和顶部的布局。
其实要想显示listview的头部或者底部布局或者控件的话不一定要用scrollview,我们也可以将头部和底部作为一个整体的布局,即头布局或者脚布局,然后调用listview的addheaderview方法或者addfooterview方法就可以将它添加到listview的头部或者底部了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
ScrollView嵌套ListView滑动冲突的解决方法
-
Android中RecyclerView嵌套滑动冲突解决的代码片段
-
Android中RecyclerView嵌套滑动冲突解决的代码片段
-
Android中listview嵌套scrollveiw冲突的解决方法
-
嵌套View的滑动,及拦截冲突问题.
-
Android listview的滑动冲突解决方法
-
Android ScrollView嵌套横向滑动控件时冲突问题
-
Android开发实现ScrollView中嵌套两个ListView的方法
-
外层竖向ScrollView,里层横向ScrollView滑动冲突的解决方法
-
Android 中ScrollView嵌套GridView,ListView的实例