android listview headview过长显示不全怎么办

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android listview headview过长显示不全怎么办相关的知识,希望对你有一定的参考价值。

参考技术A 过长显示不全,可以用滚动条。或者用android:divider="@null",
无论用哪种方法启动,每个应用程序的执行都要打开一个窗口。所谓窗口,就是屏幕上的一块矩形区域。比如打开【此电脑】,将会出现右图所示的窗口。›Windows10窗口采用了类似Office2010的功能区界面风格,这个界面让文件管理操作更加方便直观。
标题栏——其中的文字即为窗口的标题。
快速访问工具栏——在标题栏左侧的按钮区域。
功能区——位于标题栏的下方,显示了针对当前窗口内容的一些常用操作工具。在功能区右侧为功能区最小化按钮,最右边的按钮为【帮助】按钮。
工作区——窗口中最大的一块区域,也可以叫做内容窗口,可以随着窗口的变化而变化,本窗口所包含的内容都显示在内容窗口中。如果窗口内容过多,则会在窗口右侧或下方显示滚动条。
导航窗格——在工作区域的左侧显示电脑中多个具体位置的区域。
控制按钮区——在导航窗格上方的图形按钮区域。
地址栏——控制按钮区右侧的矩形区域,显示从根目录到现在所在目录的路径,可以单击各级目录名称访问上级目录。
搜索栏——在地址栏右侧,输入需要查找信息的关键字,实现快速筛选,定位文件。
状态栏——位于窗口的最下方,会根据用户选择的内容,显示出容量、数量等属性信息,用户可以参考使用。
视图按钮——在状态栏右侧的两个图标,让用户选择视图的显示方式。
边框——窗口最外边带有立体感显示的框,叫做边框,边框的主要作用是使窗口内和窗口外的显示内容产生视觉上的隔离效果,一看就直到哪些内容是属于本窗口的。

android解决ScrollView嵌套ListView不能下拉刷新

为了不误导新人,这篇帖子写的比较早了,这里2016年2月23日21:33:20更新的内容:

千万不要在实际开发中用scrollview嵌套listview\\recylerview来处理滑动嵌套,   这是种处理是相当影响性能的,之前这么做完全是抱着学习的态度,顺着嵌套的情况如何通过事件拦截的机制解决该情景.

但如果我们在实际开发中,遇到listview上方有一大块headview的scrollview里面,一定只用一个listview就好了.无论headview再复杂,都是可以去addview,然后封装到listview里面,只需要对外暴露对应更新view控件的方法即可.近期会更新一片博客+源码,到时候在贴链接~~~~

----------------------------华丽分割线--------------------------------------------------------

之前写了篇文章android(仿QQ向右滑动退出)在viewpager中onTouchEvent无法监听到ACTION_DOWN的getX的值,代码.其实总结起来也就是ViewGroup嵌套ViewGroup,在点击View的事件拦截与传递机制的问题.之前那篇文章虽然能按照那个方法解决问题,但是究其原因并未清楚领悟和掌握,为了不误导同学,加之最近阅读了相关书籍,在写一篇文章来说明这个问题.

    附上在开发过程中遇到的解决ScrollView嵌套ListView,不能下拉刷新的案例源码.

    一.ViewGroup和View内的点击事件和其作用

           ViewGroup内部关于点击事件有三个方法:

            dispatchTouchEvent()-------负责事件传递或者向下分发,在事件分发的时候,这个方法很少重写

            onInterceptTouchEvent()-------负责事件传递或者向下分发,在事件分发的时候,一般重写这个方法获取相关坐标或者位置

            onTouchEvent()------------负责事件处理,直接写点击事件的业务逻辑代码即可

             如果不好理解的话,举个例子:如果界面仅有一个ViewGroup里面,用户点击页面→经过ViewGourp的dispatchTouchEvent()onInterceptTouchEvent(),无论这两个方法返回的true或者false,都会是按照这个顺序传递事件.但如果onInterceptTouchEvent()返回true→表示事件拦截,不向下传递(不向内部嵌套的ViewGroup或者View传递,因此嵌套的ViewGroup或者View没办法处理这次用户的点击事件),交由本ViewGroup的onTouchEvent()来处理这次的点击事件.为了方便理解给大家画个图.


           View内部关于点击事件有三个方法:

            dispatchTouchEvent()-------负责事件传递或者向下分发,在View里面,这个方法不用重写,因为View本身就置于最底层了,只需要做事件消费即可

            onTouchEvent()------------负责事件处理,直接写点击事件的业务逻辑代码即可

           

           最后画一幅图形象生动表现类似多层嵌套的点击事件分发,消费图,大家今后遇到此类问题就迎刃而解了.

           注:下图如果返回True是红叉,表示上下方向不走了,也就是不向下传递了,直接消费,消费如果return True是红叉,就表示此次点击事件到此终结了.

           分发事件的顺序是:父→子,向下传递

           消费事件的顺序是:子→父,向上传递.消费和分发的顺序是反着的,大家看下图也就明白了

           scrollview嵌套listview,相当于一个viewgroup里面对view的用户ontouch事件,根据上图,如果在实际过程中listview刷新很难实现的话,就尝试在刷新的时候,阻止scrollview截获用户的touch事件,因为我就想要listview来消费这次的用户touch事件,避免父级的viewgroup也就是scrollview来分发这次的事件,这就是我解决这个问题的思路,那么将会用到这个方法requestDisallowInterceptTouchEvent(false),通俗点来说,也就是底层的view直接跳过包裹在外层的父级的viewgroup直接处理这次ontouch事件.

           关于requestDisallowInterceptTouchEvent(false),有兴趣的童鞋可以看看这篇博文http://blog.csdn.net/chaihuasong/article/details/17499799,写得比较详细.其实总结起来也就是我上面说的.

           好了,这里直接上解决的关键代码,注释写得很详细,有兴趣的童鞋可以直接下源码直接使用,或者有更好的解决方案的话,也可以给我留言,大家相互学习.(*^__^*)

		/************************关键代码**************
		 * 暂时想到的这个方案,当listview滑动到最顶部的时候,拦截scrollview事件,listview可以刷新
		 * 反之,取消拦截scrollview事件,listview不能刷新 
		 * ******************************/
		mListView.setOnTouchListener(new OnTouchListener() 

			@Override
			public boolean onTouch(View v, MotionEvent event) 
				int localheight = 0;
				switch (event.getAction()) 
				case MotionEvent.ACTION_DOWN:
					localheight = (int) event.getY();
					break;
				case MotionEvent.ACTION_MOVE:
					int sY = (int) event.getY();
					int scrollY = mScrollView.getScrollY();
					int height = mScrollView.getHeight();
					int scrollViewMeasuredHeight = mScrollView.getChildAt(0)
							.getMeasuredHeight();
					//这个表示,当滑动到scrollview顶部的时候,
					if (scrollY == 0) 
						//检测到在listview里面手势向下滑动的手势,就下拉刷新,反之,则无法触发下拉刷新
						if (localheight - sY > 10) 
							// 取消拦截scrollview事件,listview不能刷新
							mScrollView.requestDisallowInterceptTouchEvent(false);
							break;
						
						// 拦截scrollview事件,listview可以刷新
						mScrollView.requestDisallowInterceptTouchEvent(true);
					 
					//这个表示scrollview没恢复到顶部,在listview里面是无法触发下拉刷新的
					else 
						// 取消拦截scrollview事件,listview不能刷新
						mScrollView.requestDisallowInterceptTouchEvent(false);
					
					//滑动到底部的时候,自动去加载更多.
					if ((scrollY + height) == scrollViewMeasuredHeight) 
						// 滑到底部触发加载更多
						onLoadMore();
					
					break;
				case MotionEvent.ACTION_UP:
					localheight = 0;
					break;
				default:
					break;
				
				return false;
			
		);
	


以上是关于android listview headview过长显示不全怎么办的主要内容,如果未能解决你的问题,请参考以下文章

Android LinearLayout实现下拉刷新

android解决ScrollView嵌套ListView不能下拉刷新

如何在android中刷新navigationview的headview内容

解决添加FootView或HeadView不显示的兼容性问题

ListView addHeaderView

viewpager怎么实现画廊