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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理