ScroolView中的ListView冲突问题解决方案

转载 2016年05月31日 13:57:14

思路:

Listview和ScrollView都具有滚动能力,对于这样的控件在嵌套在一起使用后就会出现问题。

问题一:ScrollView与ListView嵌套导致ListView显示不完全

问题二:ScrollView不能正常滑动


解决方式一

ScrollView+LinearLayout+ListView可以换成ScrollView+LinearLayout+LinearLayout,对于开发中,ScrollView所能滚动的样式形式各异,另外的话,ScrollView所显示的内容肯定不会太多,因此这种方案是合理而且可选的。

解决方式二

同样是替换:ListView具有HeaderView与FooterView两部分,因此在非下拉刷新,上拉加载的需求中,完全可以使用ListView来代替ScrollView,因此是合理可选方案。

解决方式三

主动计算和设置ListView的高度,这样的结果最终得出类似解决一方案效果,具体来说缺点是大材小用,但也是合理的解决方法

public class Utility {
        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);
        }
    }


解决方式四

复写ScrollView,从事件方向进行处理,缺点是灵活性不够好

public class ListScrollView extends ScrollView {
	private List list = new ArrayList();
	private int scrollPaddingTop; // scrollview的顶部内边距
	private int scrollPaddingLeft;// scrollview的左侧内边距
	private int[] scrollLoaction = new int[2]; // scrollview在窗口中的位置
	private final static int UPGLIDE = 0;
	private final static int DOWNGLIDE = 1;
	private int glideState;

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

	private int downY = 0;
	private int moveY = 0;

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			downY = (int) ev.getY();
			// System.out.println("actiondown" + ev.getY());
			break;
		case MotionEvent.ACTION_MOVE:
			moveY = (int) ev.getY();
			// System.out.println("move" + moveY + "down" + downY);
			if ((moveY - downY) >= 0) {
				// System.out.println("'''''''''DOWNGLIDE'''''''''''");
				glideState = DOWNGLIDE;
			} else {
				// System.out.println("'''''''''UPGLIDE'''''''''''");
				glideState = UPGLIDE;
			}
			break;
		case MotionEvent.ACTION_UP:
		default:
			break;
		}
		return super.dispatchTouchEvent(ev);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		// 该事件的xy是以scrollview的左上角为00点而不是以窗口为00点
		int x = (int) ev.getX() + scrollLoaction[0];
		int y = (int) ev.getY() + scrollLoaction[1];
		for (int i = 0; i < list.size(); i++) {
			ListView listView = list.get(i);
			int[] location = new int[2];
			listView.getLocationInWindow(location);
			int width = listView.getWidth();
			int height = listView.getHeight();
			// 在listview的位置之内则可以滑动
			if (x >= location[0] + scrollPaddingLeft
					&& x <= location[0] + scrollPaddingLeft + width
					&& y >= location[1] + scrollPaddingTop
					&& y <= location[1] + scrollPaddingTop + height) {
				// System.out.println(glideState);
				if (((listView.getLastVisiblePosition() == (listView.getCount() - 1)) && (glideState == UPGLIDE))) {
					// System.out.println("up");
					break;
				}
				if (((listView.getFirstVisiblePosition() == 0) && (glideState == DOWNGLIDE))) {
					// System.out.println("down");
					break;
				}
				return false; // 让子控件直接处理
			}
		}
		return super.onInterceptTouchEvent(ev);
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		return super.onTouchEvent(ev);
	}

	private void findAllListView(View view) {
		if (view instanceof ViewGroup) {
			int count = ((ViewGroup) view).getChildCount();
			for (int i = 0; i < count; i++) {
				if (!(view instanceof ListView)) {
					findAllListView(((ViewGroup) view).getChildAt(i));
				}
			}
			if (view instanceof ListView) {
				list.add((ListView) view);
			}
		}
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		scrollPaddingTop = getTop();
		scrollPaddingLeft = getLeft();
		getLocationInWindow(scrollLoaction);
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		if (this.getChildCount() != 1) {
			try {
				throw new ScrollException();
			} catch (ScrollException e) {
				e.printStackTrace();
			}
		}
		list.clear();
		findAllListView(this.getChildAt(0));
	}
}





ScroolView嵌套ListView

public void setListViewHeighBasedOnChildren(ListView listView){ //获取listView 对应的adapter ...
  • qianmang
  • qianmang
  • 2016年06月12日 14:20
  • 548

ScroolView嵌套ListView以后界面默认定位到ListView部分解决办法

最近在开发时, 项目中用到了ScroolView嵌套ListView的部分 最终在代码中为ListVeiw设置lv.setFocusable(false)解决之...
  • lvshuchangyin
  • lvshuchangyin
  • 2016年07月04日 16:05
  • 552

安卓解决viewPager+scrollView+listView滑动冲突的问题

很多人在开发过程中都会设计到首页里面的排版功能,整个页面是一个可滑动的scrollView,上面是一个viewpager轮播图,然后下面又有带滑动的ListView,我们一般会先禁用ListView的...
  • bryant_liu24
  • bryant_liu24
  • 2015年08月06日 09:22
  • 1736

scroolView嵌套listview时listView只显示一条item的高,并且还能滑动问题

至于scroolView和listView的嵌套解决,网上很多方法。但我在开发中遇到了个很奇怪的问题,listView只显示一个item的高度,并且还能滑动。         解决:       ...
  • qq_37797158
  • qq_37797158
  • 2017年03月13日 15:35
  • 156

ScrollView和ListView一起使用 文本换行getMeasuredHeight等问题的解

首先,ListView不能直接用,要自定义一个,然后重写onMeasure()方法: import android.content.Context; import android.util.At...
  • xuzhuaaron1
  • xuzhuaaron1
  • 2016年06月12日 23:01
  • 374

完美解决ListView和ViewPager的滑动冲突

在网上找了一下关于ListView和ViewPager滑动冲突的问题发很多但都没有解决,也没有可运行的Demo运行。其中就包括http://www.apkbus.com/forum.phpmod=vi...
  • huluhong
  • huluhong
  • 2014年12月08日 11:59
  • 1030

Android ScrollView和ListView事件冲突问题解决方法

不知道有没有朋友遇到这种问题:就是当你一个ScrollView里面包含一个ListView的时候,你会发现一个问题:当listview里面的item条目过多的时候,在Listview中只会显示一部分,...
  • qq_26888925
  • qq_26888925
  • 2016年07月27日 12:02
  • 467

关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题

关于ListView设置了OnScrollListener之后onScrollStateChanged()和onScroll方法监听不到的问题: 原因: 首先OnScrollListene...
  • lyglostangel
  • lyglostangel
  • 2015年04月07日 15:45
  • 775

android中ListView的嵌套冲突问题

在android中有时候我们会因为项目需求的问题,需要在ScrollView中嵌套ListView,或者是在ListView中嵌套ListView。此时因为ScrollView或ListView本身就...
  • linzhaowan
  • linzhaowan
  • 2016年09月11日 19:47
  • 403

ScrollView嵌套ListView冲突问题解决方案

今天在做项目时,使用Activity 嵌套一个Fragment时出现了Fragment的界面不是顶部的现象,刚开始不知道怎么回事,经检查发现是因为Fragment里面使用了ScrollView 嵌套的...
  • songwenhui100
  • songwenhui100
  • 2016年12月23日 17:43
  • 143
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ScroolView中的ListView冲突问题解决方案
举报原因:
原因补充:

(最多只允许输入30个字)