美文网首页
ScrollView嵌套RecycleView相关问题

ScrollView嵌套RecycleView相关问题

作者: 椰子 | 来源:发表于2018-05-17 07:18 被阅读28次

一、关于NestedScrollView + RecyclerView页面载入时总是滑动到最底部
项目中遇到页面载入时总是滑动到最底部,原因是焦点在页面底部;
方法一:解决方法就是在根布局设置android:descendantFocusability="blocksDescendants" ;
android:descendantFocusability 有三种值:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

这种方法,会造成页面中Editext焦点被抢导致无法输入,需要用到第二种方法。
方法二:对于有Editext的页面需要在根布局使用 :
android:focusable="true"
android:focusableInTouchMode="true";

二、解决NestedScrollView嵌套RecycleView显示一行的bug
scrollview嵌套recyclerview不能完全显示的几种办法:
1.http://www.cnblogs.com/woaixingxing/p/6098726.html
2.http://www.jianshu.com/p/3815d36fd371?nomobile=yes
android:descendantFocusability="blocksDescendants"
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

三、解决ScrollView嵌套RecyclerView(横向)或ListView(横向)时,横向滑动不顺畅的问题。

/**
 * 解决ScrollView与RecyclerView横向滚动时的事件冲突
 */
public class ScrollRecyclerView extends RecyclerView {

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

    public ScrollRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    private float lastX, lastY;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {

        boolean intercept = super.onInterceptTouchEvent(e);

        switch (e.getAction()) {

            case MotionEvent.ACTION_DOWN:
                lastX = e.getX();
                lastY = e.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                // 只要横向大于竖向,就拦截掉事件。
                // 部分机型点击事件(slopx==slopy==0),会触发MOVE事件。
                // 所以要加判断(slopX > 0 || sloy > 0)
                float slopX = Math.abs(e.getX() - lastX);
                float slopY = Math.abs(e.getY() - lastY);
               //  Log.log("slopX=" + slopX + ", slopY="  + slopY);
                if((slopX > 0 || sloy > 0) && slopX >= slopY){
                    requestDisallowInterceptTouchEvent(true);
                    intercept = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                intercept = false;
                break;
        }
       // Log.log("intercept"+e.getAction()+"=" + intercept);
        return intercept;
    }

}

相关文章

网友评论

      本文标题:ScrollView嵌套RecycleView相关问题

      本文链接:https://www.haomeiwen.com/subject/zwvirxtx.html