Android RecyclerView的案例讲述和"The hierarchy of the type ViewHolder is inconsistent"错误解决

RecyclerView


Android 提供的一个更强大的滚动控件---RecyclerView,是一个增强版的ListView。下面介绍其用法

RecyclerView位于V7包,因此需要导入“android-support-v7”包---android-support-v7-recyclerview.jar,而在继承RecyclerView.ViewHolder自定义一个ViewHolder时报出了“The hierarchy of the type ViewHolder is inconsistent”错误,后经查阅得知RecyclerView控件依赖于“android-support-v4.jar”包,因此也需要将“android-support-v4.jar”同步导入到Eclipse中才能正常使用


jar包的位置:

android/prebuilts/sdk/current/support/v7/recyclerview/libs/android-support-v7-recyclerview.jar
android/prebuilts/sdk/current/support/v4/android-support-v4.jar  

PS:在Eclipse中手动创建一个“libs”文件夹,讲上述两个jar包拷贝到“libs”下即可使用RecyclerView控件了


编写好demo后,通过Eclipse运行时报了这个错误:Error inflating class android.support.v7.widget.RecyclerView

是jar包的原因,解决方法见:http://blog.csdn.net/u010351494/article/details/47022601


源码

1 activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

2 simple_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"
    android:background="#ff0000" >

    <TextView
        android:id="@+id/text"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_gravity="center"
        android:layout_marginBottom="10dp"
        android:layout_marginEnd="10dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="10dp"
        android:background="#000000"
        android:gravity="center"
        android:textColor="#00ff00" />

</LinearLayout>


3 MainActivity.java

package com.example.recyclerview;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends Activity {
    private String TAG = "ZZZMainActivity";

    private ArrayList<String> mAllList = new ArrayList<String>();
    private RecyclerView mRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadData();

        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(new MyAdapter());
    }

    private Object[] loadData() {
        mAllList.clear();

        mAllList.add("aa");
        mAllList.add("ddfa");
        mAllList.add("qw");
        mAllList.add("sd");
        mAllList.add("fd");
        mAllList.add("cf");
        mAllList.add("re");
        mAllList.add("aa");
        mAllList.add("ddfa");
        mAllList.add("qw");
        mAllList.add("sd");
        mAllList.add("fd");
        mAllList.add("cf");
        mAllList.add("re");
        mAllList.add("aa");
        mAllList.add("ddfa");
        mAllList.add("qw");
        mAllList.add("sd");
        mAllList.add("fd");
        mAllList.add("cf");
        mAllList.add("re");
        mAllList.add("aa");
        mAllList.add("ddfa");
        mAllList.add("qw");
        mAllList.add("sd");
        mAllList.add("fd");
        mAllList.add("cf");
        mAllList.add("re");
        return mAllList.toArray();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        public ViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.text);
        }
    }

    class MyAdapter extends RecyclerView.Adapter<ViewHolder> {

        @Override
        public int getItemCount() {
            return mAllList.size();
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            String str = mAllList.get(position);
            holder.textView.setText(str);
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.simple_list_item, parent, false);
            ViewHolder holder = new ViewHolder(itemView);
            return holder;
        }
    }
}

上述MainActivity类的onCreate方法中,如果没有加入如下代码:

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);

则会报出如下错误:

01-04 18:29:36.493 18529 18529 E AndroidRuntime: FATAL EXCEPTION: main
01-04 18:29:36.493 18529 18529 E AndroidRuntime: Process: com.example.recyclerview, PID: 18529
01-04 18:29:36.493 18529 18529 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1694)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.View.measure(View.java:19734)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1117)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:642)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.View.measure(View.java:19734)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.View.measure(View.java:19734)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:471)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.View.measure(View.java:19734)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at com.android.internal.policy.DecorView.onMeasure(DecorView.java:687)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.View.measure(View.java:19734)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2271)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1358)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1607)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6307)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.Choreographer.doCallbacks(Choreographer.java:683)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.Choreographer.doFrame(Choreographer.java:619)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:751)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:95)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:154)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6077)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
01-04 18:29:36.493 18529 18529 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
01-04 18:29:36.496  1216  2242 W ActivityManager:   Force finishing activity com.example.recyclerview/.MainActivity

总结RecyclerView用法

1.继承RecyclerView.ViewHolder实现一个自己的ViewHolder,该ViewHolder在onCreateViewHolder方法中被实例化,并传入item对应的View

2.继承ecyclerView.Adapter实现一个自己的Adapter

a. getItemCount()返回数据源的总数

b. onBindViewHolder方法使用通过形参传入过来的自己之前定义的ViewHolder,在该方法中对ViewHolder持有的对象填充数据


效果图



原文地址:http://blog.csdn.net/yelangjueqi/article/details/56280222

DEMO源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值