使用RecyclerView碰到的若干问题

RecyclerView碰到的若干问题

RecyclerView控件非常好用,横向和纵向的滑动都能有很好的效果,而且view的重用,听说效率很高(不知道真实情况如何)。在使用的过程中遇到过几个bug,现在将bug list都贴出来,并分别说明每一种bug出现的原因以及其解决方法。

一、使用RecyclerView肯定要用到support-v7包,所以导入v7包,再直接在布局文件中使用该控件。

<android.support.v7.widget.RecyclerView
        android:id="@+id/channelmanager_recyclerview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="80dp"
        android:layout_marginTop="47dp" >
</android.support.v7.widget.RecyclerView>

直接这样做的后果是很可能会产生这个RecyclerView无法解析的bug list:

08-28 15:41:12.982: E/AndroidRuntime(9259): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.recyclerviewtest/com.example.recyclerviewtest.MainActivity}: android.view.InflateException: Binary XML file line #19: Error inflating class android.support.v7.widget.RecyclerView
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.ActivityThread.access$800(ActivityThread.java:135)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.os.Handler.dispatchMessage(Handler.java:102)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.os.Looper.loop(Looper.java:136)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at java.lang.reflect.Method.invokeNative(Native Method)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at java.lang.reflect.Method.invoke(Method.java:515)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at dalvik.system.NativeStart.main(Native Method)
08-28 15:41:12.982: E/AndroidRuntime(9259): Caused by: android.view.InflateException: Binary XML file line #19: Error inflating class android.support.v7.widget.RecyclerView
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.view.LayoutInflater.createView(LayoutInflater.java:620)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.Activity.setContentView(Activity.java:1953)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at com.example.recyclerviewtest.MainActivity.onCreate(MainActivity.java:12)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.Activity.performCreate(Activity.java:5273)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	... 11 more
08-28 15:41:12.982: E/AndroidRuntime(9259): Caused by: java.lang.reflect.InvocationTargetException
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at java.lang.reflect.Constructor.constructNative(Native Method)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.view.LayoutInflater.createView(LayoutInflater.java:594)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	... 22 more
08-28 15:41:12.982: E/AndroidRuntime(9259): Caused by: java.lang.NoClassDefFoundError: android.support.v4.util.Pools$SimplePool
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.support.v7.widget.AdapterHelper.<init>(AdapterHelper.java:56)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.support.v7.widget.AdapterHelper.<init>(AdapterHelper.java:71)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.support.v7.widget.RecyclerView.initAdapterManager(RecyclerView.java:373)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.support.v7.widget.RecyclerView.<init>(RecyclerView.java:282)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	at android.support.v7.widget.RecyclerView.<init>(RecyclerView.java:266)
08-28 15:41:12.982: E/AndroidRuntime(9259): 	... 25 more
08-28 15:41:13.102: I/Process(9259): Sending signal. PID: 9259 SIG: 9

这个bug list产生的情况是最多的,也曾经让我不知道问题在哪里。仔细分析得知,是v7 jar包和v4 jar包的版本不同造成的,根据一个说法就是从官网同一个地方下载的v4和v7一般就不会有这样的问题。我这里有可以匹配的v4 和v7 jar,提供大家下载。用这两个jar基本可以保证不会出现此类的bug

二、RecyclerView没有进行设置setLayoutManager。这个问题就会直接导致空指针。

08-28 17:24:29.782: D/TextLayoutCache(11127): Using debug level = 0 - Debug Enabled = 0
08-28 17:24:30.292: D/AndroidRuntime(11127): Shutting down VM
08-28 17:24:30.292: W/dalvikvm(11127): threadid=1: thread exiting with uncaught exception (group=0x41676ba8)
08-28 17:24:30.322: D/dalvikvm(11127): GC_FOR_ALLOC freed 146K, 12% free 1372K/1548K, paused 12ms, total 12ms
08-28 17:24:30.322: E/AndroidRuntime(11127): FATAL EXCEPTION: main
08-28 17:24:30.322: E/AndroidRuntime(11127): Process: com.example.testrecycler, PID: 11127
08-28 17:24:30.322: E/AndroidRuntime(11127): java.lang.NullPointerException
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.support.v7.widget.RecyclerView.addFocusables(RecyclerView.java:1332)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewGroup.addFocusables(ViewGroup.java:914)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewGroup.addFocusables(ViewGroup.java:914)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewGroup.addFocusables(ViewGroup.java:914)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewGroup.addFocusables(ViewGroup.java:914)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.View.addFocusables(View.java:6711)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.FocusFinder.findNextFocus(FocusFinder.java:92)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.FocusFinder.findNextFocus(FocusFinder.java:65)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewRootImpl.focusSearch(ViewRootImpl.java:5234)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewRootImpl.leaveTouchMode(ViewRootImpl.java:3361)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewRootImpl.ensureTouchModeLocally(ViewRootImpl.java:3294)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1262)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5672)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:772)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.Choreographer.doCallbacks(Choreographer.java:585)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.Choreographer.doFrame(Choreographer.java:555)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:758)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.os.Handler.handleCallback(Handler.java:733)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.os.Handler.dispatchMessage(Handler.java:95)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.os.Looper.loop(Looper.java:136)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at java.lang.reflect.Method.invokeNative(Native Method)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at java.lang.reflect.Method.invoke(Method.java:515)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
08-28 17:24:30.322: E/AndroidRuntime(11127): 	at dalvik.system.NativeStart.main(Native Method)
08-28 17:24:30.702: I/Process(11127): Sending signal. PID: 11127 SIG: 9

这个问题的解决方式就太简单了,初始化该RecyclerView(即findViewById来找到,然后设置setLayoutManager就行了)

public class MainActivity extends Activity {

private RecyclerView mRecyclerView;
private MyAdapter myAdaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mRecyclerView = (RecyclerView) this.findViewById(R.id.channelmanager_recyclerview);
this.mRecyclerView.setHasFixedSize(true);
this.mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//this.myAdaper = new MyAdapter();
//this.mRecyclerView.setAdapter(myAdaper);
}

如上adapter即使没有设置,也不会有任何bug问题,解决简单。

至此,基本上再没有关于RecyclerView的任何问题了…………

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-28 21:29:31

使用RecyclerView碰到的若干问题的相关文章

ansj 2.0.7 错误例子分析

我在做一个solr的项目,分词选定了ansj分词. 选择ansj的原因: 1)身边若干朋友的念叨,说是效果不错 2)网上看了若干评论,说是不错 3)自己尝试了一些case,觉得确实不错. 好了,项目中选择了ansj2.0.7-min.jar作为实际使用的版本. 结果...愿望是美好的,现实是残酷的. 碰到了若干case,效果不好(使用IndexAnalysis): 1)上海马勒别墅 切分结果:(上/海马/勒/别墅) 预期结果:(上海/马勒/别墅) 调试了一下,在构建Graph的时候没有问题,问题

Java 计算中英文长度的若干种方法

在项目开发中经常碰到到输入字符的校验,特别是中英文混合在一起的校验.而为了满足校验的需求,有时需要计算出中英文的长度. 本文将通过几种常用的方法实现长度的计算: <span style="font-size:18px;">import java.io.UnsupportedEncodingException; /** * 中英文校验的处理 * @author a123demi * */ public class EnChValidate { public static vo

安装win和xp双系统 若干问题

装了winxp和linux双系统,后先在winxp下手动格式化了linux系统,后启动时提示grub错误,重新分区后系统也 2010-09-17 21:07 [清风剑] | 分类:Linux | 浏览991次用fdisk /mbr后,再ghostxp,启动提示 disk error! 用安装盘分区装了系统后,启动提示"A disk read error occurred Press Ctrl+Alt+Del to restat"错误,一查可能是数据线的问题,换一根就解决了,谢谢各位大侠

scrollview嵌套上下拉控件嵌套recyclerview

相信会碰到很多类似的需求,一个列表控件,然后控件上方的一个头部需要自定义,这样就不好有时候也不能加在列表控件的头部了,那必须得嵌套一层scrollview了,没毛病,那么一般的列表控件都是有上拉下拉的操作,而且一般也是在 github 上找寻一个收藏量高的 来做为一个全局通用的上下拉控件,这里问题就来了,一般的 scrollview 嵌套 recyclerview 或者 listview 都毕竟容易解决,可是在加上一层上下拉控件呢?上下拉控件肯定会有它自己的触摸处理机制,这样你改起来也很麻烦,这

C#中使用多线程访问Winform中控件的若干问题

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(Thread

ScrollView嵌套recyclerView出现的滑动问题

记得以前在解决scrollView与ListView嵌套问题时,那个时候是自定义了listView去测量listView高度,今天项目中刚 好碰到了要用recycerView,同样也是嵌套在scrollView中,但是按照以前listView方法居然不显示了,后来发现原来是要重写的是 LayoutManager... 在此说明,这是copy大神的,我只是为了学习啊!大神真的很牛啊! 原创博客:http://blog.csdn.net/u010623588/article/details/5026

android RecyclerView布局真的只是那么简单!

如今android N都已经出来了,作为一个android开发者如果还不知道如何使用android5.X的 RecyclerView未免有点说不过去了. RecyclerView比ListView更灵活,更强大.因此也会引入一些复杂性,而这些复杂性,恰恰是在新手前进道路上的很大阻碍,而笔者此文也便是希望可以给予读者一些帮助. RecyclerView是什么? 笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方

iOS上用FTGL显示定制Truetype字体碰到的问题

没想到这个问题搞了快2个月时间:当然跟我只是断断续续地工作有关. FTGL是freetype的opengl实现.我接触FTGL最初只是为了练习OpenGL,写几个简单的游戏app.开始试了试FTGL觉得挺简单好用,不需要太熟悉OpenGL底层的东西,于是决定在自己的一个app中正式加入用FTGL显示艺术True type字体的功能,预计应该很快能完成吧. 开始进展很顺利,似乎即将大工告成,结果最后突然发现一个问题:艺术字体(中文)显示若干段落以后,突然渲染不正常,总是显示一些混乱的字符:排除了应

RecyclerView的通用适配器

本来这一个主题应该早就写了,只是项目多,属于自己的时间不多,所以现在才开动!! 前一段时间写了一篇文章,是关于ListView,GriView万能适配器,没有看过的同学,可以先看看那篇文章,然后在来学习RecyclerView的话,会容易很多.链接http://www.cnblogs.com/huangjialin/p/7661328.html 当然,如果对RecyclerView基础不是了解的朋友,建议先去熟悉一下RecyclerView的基础知识! 闲话不多说,先简单的介绍一下这个Recyc