解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题

在一个滑动控件或者是布局里面,添加另外一个可以滑动的控件,通常会造成一些莫名其妙的问题。今天主要介绍在工作中遇到的,在ScrollView布局中嵌套Listview显示不正常,和在Listview中嵌套Listview的滑动冲突的问题。

1.ScrollView布局中嵌套Listview显示不正常的解决方案

目前来说,解决这个问题有好几种解决方案,这里只介绍其中两种比较简单易行的其中两种。

(1)自定义一个Listview,继承自Listview,代码如下:

public class ListViewForScrollView extends ListView {

	public ListViewForScrollView(Context context) {
		super(context);
	}

	public ListViewForScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ListViewForScrollView(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);
	}

}

在使用的时候,用这个控件代替Listview控件即可。

(2)重新计算Listview的高度

在一个滑动布局中添加一个滑动控件,滑动控件的高度因为不能计算,所以只能显示一个Item,若要解决这个问题,我们可以重新计算Listview的高度,调用下面的静态方法即可。

/**
	 * scrollview嵌套listview显示不全解决
	 *
	 * @param listView
	 */
	public static void setListViewHeightBasedOnChildren(ListView listView) {
		ListAdapter listAdapter = listView.getAdapter();
		if (listAdapter == null) {
			return;
		}

		int totalHeight = 0;
		for (int i = 0; i < listAdapter.getCount(); i++) {
			View listItem = listAdapter.getView(i, null, listView);
			listItem.measure(0, 0);
			totalHeight += listItem.getMeasuredHeight();
		}

		ViewGroup.LayoutParams params = listView.getLayoutParams();
		params.height = totalHeight
				+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
		listView.setLayoutParams(params);
	}

2.在Listview中嵌套Listview的滑动冲突问题

之前在项目中,出现了这种需求,就是在一个listview的footer中添加一个小的Listview,但是由于触摸冲突问题,小的listview不能滑动,若要解决这个问题,我们可以自定义一个控件继承自listview,然后重写onInterceptTouchEvent方法,对触摸事件进行分发。

onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截,我们可以在这个方法里面,对子控件或者是父控件获取触摸处理权限进行分发,从而完成各自的滑动任务。

效果图如下

代码如下

/**
 *
 * @ClassName: com.example.listdemo.InnerListview
 * @Description: 可以放在Listview中的Listview
 * @author zhaokaiqiang
 * @date 2014-8-15 下午2:43:34
 *
 */
public class InnerListview extends ListView {
	public InnerListview(Context context) {
		super(context);
	}

	public InnerListview(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public InnerListview(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		// 当手指触摸listview时,让父控件交出ontouch权限,不能滚动
		case MotionEvent.ACTION_DOWN:
			setParentScrollAble(false);
		case MotionEvent.ACTION_MOVE:
			break;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_CANCEL:
			// 当手指松开时,让父控件重新获取onTouch权限
			setParentScrollAble(true);
			break;

		}
		return super.onInterceptTouchEvent(ev);

	}

	// 设置父控件是否可以获取到触摸处理权限
	private void setParentScrollAble(boolean flag) {
		getParent().requestDisallowInterceptTouchEvent(!flag);
	}

}

这样,外面的listview和里面的小listview就都可以实现各自的滑动了。

本文章出自http://blog.csdn.net/zhaokaiqiang1992,转载请说明!

解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题

时间: 2024-12-28 21:20:35

解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题的相关文章

ArcMap中地图输出(Options)选项显示不完整

首先,我开始遇到的时候,认为是高分辨屏幕的问题,所以修改了屏幕的分辨率,结果并没有改变. 然后,认为是对话窗口的显示,修改字体大小,也没有显示完整. 最后,是修改了ArcGIS的注册表才解决.解决方式如下: 键盘输入"Win+regedit",打开注册表 找到HKEY_CURRENT_USER>Software>ESRI>Desktop10.2>export>ExportDlg,双击,把ShowOptionsPanel的值修改为1

Android中ViewPager与HorizontalListView的滑动冲突处理

Android开发中,有不少的控件都有点击或滑动冲突事件,比如ListView的onitemclick事件与item上的Button(如果有Button的话)等.今天在工作中用ViewPager里面的页面套用HorizontalListView,横向 划动也有冲突,解决办法很简单,只要在HorizontalListView中重写onInterceptTouchEvent(MotionEvent ev)方法中添加 getParent().requestDisallowInterceptTouchE

解决ScrollView中嵌套ListView滚动效果冲突问题

在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样 式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起了冲 突,一般不建议两者套用. 下面说说具体解决方案.方案的主要思路就是根据ListView子项重置其高度. 解决方案代码如下: java代码: [html] view plain copy print? /** * 重

浅谈android中的ListView合集系列之解决ScrollView和ListView嵌套冲突(一)

相信大家都已经可以熟练使用ListView和GridView,大神们估计都在使用RecyclerView了.如果还在使用ListView,你肯定有这样的一个深刻的感受,那就是在做一个APP的时候使用ListView和GridView很频繁,并且经常会遇到一个页面中除了有ListView或GridView可能还有一些其他的内容,但是可能内容很多,你第一时间就会想到让它整体滑动即可,那就是在总的布局外面包裹一个ScrollView.也就是出现了ScrollView中嵌套一个ListView的场景,或

Listview或者GridView嵌套在ScrollView中只显示一行item解决方法。

页面里有ListView(GridView)和一些固定布局让他们一起在整个屏幕上滚动方法: (1)自定义ListView(GridView),重写onMeasure()方法,我以GridView为例(ListView只需要extends ListView)具体代码如下: package top.ant.view; import android.content.Context; import android.util.AttributeSet; import android.widget.Grid

四种方案解决ScrollView嵌套ListView问题(转)

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方案解决ScrollView嵌套ListView问题

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方法解决scrollview嵌套listview,listview高度确定问题

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表

四种方案解决ScrollView嵌套ListView问题 [复制链接]

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表