当我们用到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);
有疑问或者更好地实现方式的话 请加QQ群:135451435。共同进步!