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

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;
            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值