您的位置:首页 > 其它

RecyclerView常见的问题以及解决方案

2018-01-10 21:50 411 查看
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;
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: