我在运行时遇到此异常:
android.view.InflateException:二进制XML文件行#8:错误膨胀类android.support.v7.widget.RecyclerView
引起:java.lang.ClassNotFoundException:
没找到课程" android.support.v7.widget.RecyclerView"路径:/data/app/my.package.location-1.apk
关于这个错误有一些问题,我从中学到了这些错误:
- 在xml和Java代码中准确指定support.v7
RecyclerView
- 在Eclipse中,我将这个jar文件作为库添加到项目中:
ADT-束 - 窗口x86_64-20140321 \ SDK \额外\机器人\支持\ V7 \ recyclerview \库\机器人支撑-V7-recyclerview.jar
- 在Eclipse中,导入* adt-bundle-windows-x86_64-20140321 \ sdk \ extras \ android \ support \ v7 \ recyclerview *中的现有项目TestActivity
然后将该项目添加到我自己项目的Java Build Path中。
Project Build Target是Android 5.1.1 / API 22
一切都没有效果。 还有什么?
来自MyFragment.java的
import android.support.v7.widget.RecyclerView;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
final Activity thisActivity = getActivity();
final RecyclerView recyclerView = (RecyclerView)thisActivity.findViewById(R.id.my_listview);
final List<String> list = Arrays.asList(HEADERS);
final MyRecyclerAdapter adapter = new MyRecyclerAdapter(list);
recyclerView.setAdapter(adapter);
}
MyRecyclerAdapter.java
import android.support.v7.widget.RecyclerView;
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {
private ArrayList<String> mDataset;
// Provide a suitable constructor (depends on the kind of dataset)
public MyRecyclerAdapter(List<String> list) {
mDataset = (ArrayList<String>) list;
}
// Create new views (invoked by the layout manager)
@Override
public MyRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent, false);
// set the view's size, margins, paddings and layout parameters
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
final String name = mDataset.get(position);
holder.txtId.setText(mDataset.get(position));
holder.txtId.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
remove(name);
}
});
holder.txtType.setText("Footer: " + mDataset.get(position));
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.size();
}
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView txtId;
public TextView txtType;
public TextView txtName;
public ViewHolder(View v) {
super(v);
txtId = (TextView) v.findViewById(R.id.id);
txtType = (TextView) v.findViewById(R.id.type);
txtName = (TextView) v.findViewById(R.id.name);
}
}
public void add(int position, String item) {
mDataset.add(position, item);
notifyItemInserted(position);
}
public void remove(String item) {
int position = mDataset.indexOf(item);
mDataset.remove(position);
notifyItemRemoved(position);
}
}
fragment.xml之
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#000000" >
<android.support.v7.widget.RecyclerView
android:id="@+id/my_listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
row_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/id"
android:textColor="#FFFFFF"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp" >
</TextView>
<TextView
android:id="@+id/type"
android:textColor="#FFFFFF"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp" >
</TextView>
<TextView
android:id="@+id/name"
android:textColor="#FFFFFF"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp" >
</TextView>
</LinearLayout>
编辑:正如Arman Kabir所建议的那样,我检查了#34; Is Library&#34;。这确实解决了ClassNotFoundException
。它确实导致了稍微不同的错误,但这是另一个问题。
android.view.InflateException: Binary XML file line #8: Error inflating class android.support.v7.widget.RecyclerView
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
... 44 more
Caused by: java.lang.NoClassDefFoundError: android.support.v4.util.Pools$SimplePool
at android.support.v7.widget.AdapterHelper.<init>(AdapterHelper.java:56)
at android.support.v7.widget.AdapterHelper.<init>(AdapterHelper.java:71)
at android.support.v7.widget.RecyclerView.initAdapterManager(RecyclerView.java:455)
at android.support.v7.widget.RecyclerView.<init>(RecyclerView.java:339)
... 47 more
答案 0 :(得分:7)
在工作区的eclipse中,使用现有代码创建一个新项目,然后在android SDK支持中选择Recycler的路径,在属性中选择编译器google API 20或21并选中Is Library。
之后,在工作区中选择您自己的项目,右键单击属性并转到android部分,在库中单击“添加”按钮,然后从列表中选择您的Recycler项目。
接下来,您必须从项目菜单中清除所有项目。
很抱歉,如果我的英语非常糟糕,但它的解决方案只是通过错误添加suuport v7作为jar,而不是像v4那样。
答案 1 :(得分:3)
切换到Android Studio是一个更好的选择,但渲染问题仍然存在。
要在Android Studio中删除相同内容,请将“Gradle Dependencies”添加到您的模块中。
dependencies {
...
compile 'com.android.support:recyclerview-v7:21.0.+'
}
希望这有助于帮助我的人。这是一个很小的变化,但非常烦人。
答案 2 :(得分:1)
如果您不知道哪个jar文件包含您要查找的类,可以使用此bash命令。在Windows上,如果安装Cygwin,则可以运行它。
for find . -name \*.jar
;回声$ i; jar tvf $ i | fgrep $ *;完成
这应该在子目录中搜索并帮助您找到丢失的jar文件。
答案 3 :(得分:1)
这是我完成mqtt项目的日食之旅。
首先,您必须检查支持库是否存在,如果不存在,则必须使用sdk manager下载它。
我知道你已经有了这个库。 只需检查支持库所在的目录。 您一定要确认图片上有四个目录。
在你的情况下, 你将有两个核心库appcompat-v7 和support-v4至少都是22或更高版本。
每个文件夹中必须有一个aar文件。你必须将后缀aar更改为zip,然后将其解压缩到该文件夹下。将classes.jar重命名为appcompat-v7-22.1.0.jar和support-v4-22.1.0.jar。
这意味着您已准备好将它们复制到项目中正确的libs文件夹中。
您对两个文件夹执行相同的操作。
在recyclerview-v7 \ 21.0.0文件夹中,您可以将classes.jar重命名为您想要的任何名称,并在support-annotations \ 21.0.0 \下复制support-annotations-21.0.0.jar然后复制它们到项目的libs文件夹中。
将现有的Android项目导入您的日食,
另外,对support-v4-22.1.0库也做同样的事情。
不要忘记选中复选框 - 'Is Library'
您最终可以为您的项目设置所有配置,如下图所示。
这是我的project.properties文件。
target=android-21
java.target=1.7
java.source=1.7
android.library.reference.1=..\\MqttService
android.library.reference.2=..\\extras\\android\\m2repository\\com\\android\\support\\appcompat-v7\\22.1.0\\appcompat-v7-22.1.0
android.library.reference.3=..\\extras\\android\\m2repository\\com\\android\\support\\support-v4\\22.1.0\\support-v4-22.1.0
答案 4 :(得分:0)
如果您将android studio更新为v-3.4.2
然后更改为
android.support.v7.widget.RecyclerView
到
androidx.recyclerview.widget.RecyclerView
这对我有用。
答案 5 :(得分:0)
Simple Two Steps:
In stand off
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_News"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
Replace with androidx package in xml file as below
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
@Ambilpura
答案 6 :(得分:0)
实现'com.google.android.material:material:1.4.0-alpha02'
如果这在您的依赖项列表中,您应该删除它和任何其他与回收视图相关的依赖项并同步 Gradle。
并添加这两个依赖项。
实现'com.android.support:appcompat-v7:21.0.3'
实现'com.android.support:recyclerview-v7:21.0.0'