一、关于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;
}
}