关于android.support.v7.widget.RecyclerView包导入项目引发的BUG

当我们用到RecyclerView时,在demo中或许运行的很正常,可是一挪到项目中就会出现一些还无头绪的bug。再此总结一下,我所碰到的错误。

此文是继 Android滑动展示图片(一页多图,带小圆点,类似小米市场APP详情页图片展示)中使用RecyclerView出现的问题进行分析和解决。

大家导入到自己项目的时候估计会出现一些错误,比如The type android.support.v4.util.Pools$Pool cannot be resolved 。当你导入别人项目里的android.support.v7.widget.RecyclerView包的时候,RecyclerView估计会报这个错误,这是因为版本问题,和你之前导入的v4包版本不一致,因为v7的资源包中有些也会调用v4中的资源,所以版本不同会出现问题,需要自己去本地找,在\sdk\extras\android\m2repository\com\android\support\recyclerview-v7里,打开21.0.0里面有recyclerview-v7-21.0.0.aar,用压缩工具打开,将里面的classes.jar取出来,为了好识别将其重命名为android-support-v7-recyclerview.jar即可,然后导入到libs中,该问题解决。(要确保v4版本也是在自己的sdk中获取的。)

然而此时implements OnScrollListener也许会报错,The type RecyclerView.OnScrollListener cannot be a superinterface of MyRecyclerView,a superinterface must be an interface.大致意思是RecyclerView.OnScrollListener不能做为MyRecyclerView的一个超级接口,一个超级接口本质上来说还是一个接口。这是什么意思呢?很奇怪啊,RecyclerView.OnScrollListener居然不是一个接口,而是一个抽象类。具体的大家可以看看这里所以在此我们就只能去声明一个类,继承RecyclerView.OnScrollListener

private class MyScrollListener extends RecyclerView.OnScrollListener {  
  
        @Override  
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
            // TODO Auto-generated method stub  
            super.onScrollStateChanged(recyclerView, newState);  
        }  
  
        @Override  
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {  
            // TODO Auto-generated method stub  
            super.onScrolled(recyclerView, dx, dy);  
  
            View newView = null;  
            if (dx > 1) { // 向右滑动  
                newView = getChildAt(1); // 记录第二个View也就是当前屏幕最后一个  
            } else if (dx < -1) { // 向左滑动  
                newView = getChildAt(0); // 记录第一个View也就是当前屏幕第一个  
            }  
            if (mItemScrollChangeListener != null) {  
                if (newView != null && newView != mRecordView) {  
                    mRecordView = newView;  
                    mItemScrollChangeListener.onChange(mRecordView,  
                            getChildPosition(mRecordView));  
                }  
            }  
  
        }  
  
    }  

public MyRecyclerView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        // TODO Auto-generated constructor stub  
        this.setOnScrollListener(new MyScrollListener());  
    }  

好吧,该问题解决。

然后我们会发现在调用自定义RecyclerView时会发生java.lang.NullPointerException at android.support.v7.widget.RecyclerView.onMeasure这种错误,这种情况应该是recyclerview的使用问题了,我们需要去为RecycleView设置一个LayoutManager,它有三种布局,如果你需要一个看起来类似ListView形式的则用LinearLayoutManager,如果你想要一个看起来类似GridView形式的那就用GridLayoutManager,还有一种类似staggered的瀑布流形式,就用StaggeredGridLayoutManager。在此我需要的是类似ListView形式的,所以我使用了LinearLayoutManager。

		LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
		linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
		mRecyclerView.setLayoutManager(linearLayoutManager);


ok,该问题解决。

有疑问或者更好地实现方式的话 请加QQ群:135451435。共同进步!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值