2018第一个星期过了,第一篇博客东拼西凑出来了,之前的博客一直都是东拼西凑总结别人的内容,我暂时没有什么原创,就记录一下平时开发中遇到的问题吧,也算是进步的开始了。
以下详细描述问题以及解决方法:
1.ScrollView中嵌套RecyclerView时会导致RecyclerView中item的布局显示不完整,或者设置的长宽参数失效
这个问题主要是由于inflate方法参数不正确引起的。LayoutInflate.inflate()方法概述如下:
三个参数
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
主要分为三种情况:root不为null,attachToRoot为true:表示将resource指定的布局添加到root中,添加的过程中resource所指定的的布局的根节点的各个属性都是有效的.如下代码,最后不需要add方法就能加入布局(且不能使用add再添加,否则报错)
LinearLayout ll = (LinearLayout) findViewById(R.id.ll); LayoutInflater inflater = LayoutInflater.from(this); inflater.inflate(R.layout.linearlayout, ll,true);
root不为null,attachToRoot为false:表示不将resource指定的布局添加到root中,但是resource指定的布局的根布局的布局参数LayoutParams有效。(root会协助resource指定的布局的根节点生成布局参数)
- root为null:不需要将resource指定的布局添加到任何容器中,也不需要协助生成布局参数。此时attachToRoot为false或true效果都一样
两个参数
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root)
主要分为两种情况:- root不为null,同上attachToRoot为true的情况
- root为null,同上root为null的情况
详细案例请参考http://blog.csdn.net/u012702547/article/details/52628453
解决方案:
在RecyclerView.Adapter中onCreateViewHolder创建布局时采用以下方法:
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rent_car_list
, parent,false);
2.RecyclerView将指定position位置的item移到顶部
index为要移到的position值,是从RecyclerView的item位置开始的,不是从可见位置开始。这样跳转比较生硬,可以采用弹性滑动,以后有时间弄弄
llManager.scrollToPositionWithOffset(index,0);
3.顶部的Banner处于无限轮播状态,RecyclerView往下滑时,Banner可能被回收了,再滑回顶部时可能又重创了Banner,导致Banner轮播错乱(应该是起了多个线程去延时更新Banner)
主要是由于Banner内部的线程没有停止。因此要在BannerView的以下三个方法中停止线程轮播:
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
// 开始轮播
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
// 停止轮播
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
if (visibility == GONE) {
// 停止轮播
} else if (visibility == VISIBLE) {
// 开始轮播
}
super.onWindowVisibilityChanged(visibility);
}
4.RecyclerView或者ScrollView嵌套RecyclerView,导致页面切换后总是自动滑动到嵌套着的RecyclerView的顶部Item位置。
原因:RecyclerView默认会获取焦点,所以解决方法有多种,可以让其他的控件获取焦点,或者不允许RecyclerView获取到焦点。以下提供两种解决方案,亲测有效。
①该方案适用于嵌套的有多个RecyclerView
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"/>
</RelativeLayout>
②该方案只适合嵌套的只有一个RecyclerView
carInfoViewHolder.recyclerView.setFocusableInTouchMode(false);
carInfoViewHolder.recyclerView.requestFocus();
5.判断RecyclerView滑动到底部,再进行其他操作。
解决代码如下。需要注意一点,在ACTION_UP中进行判断。其中:
RecyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部
RecyclerView.canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
float y = 0;
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
y = motionEvent.getRawY();
break;
case MotionEvent.ACTION_UP:
float scrollY = motionEvent.getRawY();
if(Math.abs(scrollY-y)>20){
if(!recyclerView.canScrollVertically(1)){
gotoPager(CarCenterFragment.class,null);
}
}
break;
}
return false;
}
});