androidscrollview嵌套
❶ 如何在ScrollView中嵌套ListView
单总结如下:
1.不要在ScrollView中嵌套ListView a.用一个LinearLayout来代替ListView。里面的item通过addView添加进去。 b.不用ScrollView,整个界面用一个ListView。ListView上面和下面的内容通过addHeaderView和addFooterView添加到ListView里。 有时候采用这种方式不错的。
2.非要在ScrollView中嵌套一个ListView。 a.继承ListView重写一个类,在ListView的onMeasure方法里自己来计算ListView的高度。 b.在代码中通过ListView的adapter中item的个数计算得出ListView应该的高度,然后通过setLayoutParam来指定ListView的高度。 但是上面所说的两种在ScrollView中嵌套ListView的方法都存在一个通用的bug: 当光标在ListView中移动时ScrollView不能一起滚动 所以,在android的开发中还是要尽最大的努力去避免在ScrollView中嵌套ListView
❷ android scrollview 嵌套listview 不滑动
不滑动的原因是有冲突,你必须自定义一个LIstView才行,你参考下面的代码就行了
public class NonScrollListView extends ListView {
public NonScrollListView(Context context) {
super(context);
}
public NonScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
❸ android scrollview 嵌套webview 有其他方式没
Android中WebView用来加载html页面,自带滑动效果。ScrollView同样也是自带滑动效果,在项目中如果需要WebView和一些其他view比如TextView一起滑动的话就必须外面嵌套一层ScrollView,这时问题就来了,嵌套之后ScrollView的滑动和WebView的滑动就会有冲突,WebView的滑动不流畅。下面就是解决方案:
自定义一个ScrollView
public class MyScrollView extends ScrollView {
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, new YScrollDetector());
setFadingEdgeLength(0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
// Return false if we're scrolling in the x direction
class YScrollDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (Math.abs(distanceY) > Math.abs(distanceX)) {
return true;
}
return false;
}
}
}
上面代码中onInterceptTouchEvent方法是关键,重写这个方法使如果ScrollView有touch事件时不被拦截,这样只要ScrollView有touch事件优先处理,这样就保证了滑动的流畅。
之后就在自己的xml布局文件里用MyScrollView代替ScrollView来布局就ok了。如:
<com.boohee.widgets.MyScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/main_bg"
android:layout_marginTop="@dimen/default_shadow_margin" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="180dp" >
<android.support.v4.view.ViewPager
android:id="@+id/vp_top_show"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<LinearLayout
android:id="@+id/dot_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:padding="10dp" >
</LinearLayout>
</RelativeLayout>
<WebView
android:id="@+id/wv_show"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layerType="software"
android:scrollbars="none" />
</LinearLayout>
</com.boohee.widgets.MyScrollView>
❹ android scrollview 嵌套 viewpager 嵌套 gridview 冲突问题
解决滑动冲突在子控件中注册一个onTouch事件然后在里面增加一行代码:getParent().(true);表示告诉父控件,不要处理这个Touch事件
❺ android ScrollView嵌套不显示
你的报错:boolean java.lang.String.equals(java.lang.Object)' on a null object reference;前面string值为null,调用equals方法出现空指针,看下string对象为什么为null,跟ScrollView嵌套不显示没关系。
❻ Android高级ui13-nestedscrollview嵌套滚动机制
学习笔记,整理中;
面:
android.overridePathCheck = true
自己思路整理:
1、MyNestedScrollChildLextends LinearLayoutimplements NestedScrollingChild
onTouchEvent主要处理此方法,在action_down中 startNestedScroll开始找寻父级的嵌套滚动view; 在action_move中dispatchNestedPreScroll 先分发给父级消费,返回true父级消费完再回来。如果需要二次问询则不要pre,还是先问再回来;action_up处理stopNestedScroll 以及fling 惯性滚动,逻辑类似
2、MyNestedScrollParentLextends LinearLayoutimplements NestedScrollingParent
onNestedPreScroll主要处理此方法,注意要处理消费和滚动,并且过度滚动情况
3、NestedScrollingParentHelper helper --里面已处理大部分情况
---------------------------------------------------------------------------------------------------------
摘要:
嵌套滑动机制
NestedScrollView 属于MD控件
分析嵌套滑动机制 原理
事件序列
down -> ..... move -> up/cancel
1. view down没有消费,那么后续的move 没办法再接收到了
分发
activity -> viewgroup -> view
消费
view -> viewgroup -> activity
嵌套滑动
> mTouchslop 最小滑动距离
canScrollVertically(-1) <0
scrollBy 移动屏幕
传统的事件冲突解决方案
OverScroller
为什么需要
嵌套滑动机制 并没有改变事件分发机制
NestedScrollingParentLayout extends LinearLayout implements NestedScrollingParent
NestedScrollingParent接口 可滑动的viewgroup 充当父view
NestedScrollingChild接口 充当子view
孔融让梨
1. -》 父亲 dispatchNestedPreScroll
1. 全部吃了
2. 咬一口 还要剩余
2. 孔融再吃
1. 全部吃完
2. 咬两口 还要剩余
-》 父亲 dispatchNestedScroll
1. 全部吃了
2. 又咬一口 还要剩余
2. 孔融再吃2
1. 全部吃完
int type 事件类型:
touch
fling
NestedScrollView
1. 梳理了事件分发机制
2. 为什么需要嵌套滑动机制 解决传统事件滑动机制的bug
3. 介绍了NestedScrollingParent NestedScrollingChild
NestedScrollingChildHelper
NestedScrollingParentHelper
内容:
❼ Android Scrollview 嵌套 ListView 显示不全的原因和解决方法
ScrollView 继承 FrameLayout,FrameLayout -> onMeasure()
ViewGroup -> measureChildWithMargins()
ScrollView 重写了 measureChildWithMargins() 方法
ListView -> onMeasure()
❽ 如何在ScrollView嵌套另一个ScrollView
android开发中ScrollView嵌套ScrollView是android最常用的功能,每一位学习安卓培训的都应该对它们的原理有深入的了解,我专门整理出几个实例, 为大家解析一下android培训中ScrollView嵌套ScrollView的原理。
大家好,众所周知,android 里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂android的人提出来的)
难道就真的不能嵌套吗? 当然可以,只要你再写一个ScrollView,在里面做点脚,它就支持嵌套了。
目前做的这个只支持两个ScrollView嵌套,两个以上还有待改进,能套两个就已经能满足很多需求了,呵呵,另外现在只做了纵向scrollview的支持,横向的还没来的急做哦。
package com.sun.shine.study.innerscrollview.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;
public class InnerScrollView extends ScrollView {
/**
*/
public ScrollView parentScrollView;
public InnerScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private int lastScrollDelta = 0;
public void resume() {
overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);
lastScrollDelta = 0;
}
int mTop = 10;
/**
* 将targetView滚到最顶端
*/
public void scrollTo(View targetView) {
int oldScrollY = getScrollY();
int top = targetView.getTop() - mTop;
int delatY = top - oldScrollY;
lastScrollDelta = delatY;
overScrollBy(0, delatY, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);
}
private int getScrollRange() {
int scrollRange = 0;
if (getChildCount() > 0) {
View child = getChildAt(0);
scrollRange = Math.max(0, child.getHeight() - (getHeight()));
}
return scrollRange;
}
int currentY;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (parentScrollView == null) {
return super.onInterceptTouchEvent(ev);
} else {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 将父scrollview的滚动事件拦截
currentY = (int)ev.getY();
setParentScrollAble(false);
return super.onInterceptTouchEvent(ev);
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
// 把滚动事件恢复给父Scrollview
setParentScrollAble(true);
} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
}
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
View child = getChildAt(0);
if (parentScrollView != null) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
int height = child.getMeasuredHeight();
height = height - getMeasuredHeight();
// System.out.println("height=" + height);
int scrollY = getScrollY();
// System.out.println("scrollY" + scrollY);
int y = (int)ev.getY();
// 手指向下滑动
if (currentY < y) {
if (scrollY <= 0) {
// 如果向下滑动到头,就把滚动交给父Scrollview
setParentScrollAble(true);
return false;
} else {
setParentScrollAble(false);
}
} else if (currentY > y) {
if (scrollY >= height) {
// 如果向上滑动到头,就把滚动交给父Scrollview
setParentScrollAble(true);
return false;
} else {
setParentScrollAble(false);
}
}
currentY = y;
}
}
return super.onTouchEvent(ev);
}
/**
* 是否把滚动事件交给父scrollview
*
* @param flag
*/
private void setParentScrollAble(boolean flag) {
parentScrollView.(!flag);
}
}
❾ Android中Scrollview布局中的嵌套的布局可以实现点击事件吗
当然可以,给View设置点击事件只需要调用setOncCickListener()方法,然后重写onClick方法即可。
❿ 关于android ,ScrollView嵌套listview的问题
你发错分类了吧,这个是.net分类
不过我可以回答你
listview的高度可以用内容来撑,为了美观的话可以给上下左右设置marign
另外你可以给listview一个下margin就不会显示不全了