我试图关注Creating Lists and Cards的Android官方文档。
在页面的第三个(从顶部)代码示例中,有一个关于如何实现MyAdapter
的示例,它提供对数据集中项目的访问,为项目创建视图并替换它们当他们不再可见时。
问题是,在onCreateViewHolder
上,他们将v
View
传递给ViewHolder
,而ViewHolder
就是在此之前实施的。 TextView
的构造函数需要android.widget.textview cannot be applied to android.view.view
。 Android Studio 1.0比喊:
{{1}}
出了什么问题?
答案 0 :(得分:20)
这是新的RecyclerView
模式。在其中,您使用3个组件:
ViewHolder
对象。在其中,您可以定义View字段和一个接受View v作为参数的构造函数。在此构造函数中,使用v.findViewById()绑定所有这些视图
onCreateViewHolder()
做两件事 - 首先从布局中膨胀View对象。然后创建一个ViewHolder(您在上面定义的ViewHolder),并将此膨胀的View作为参数传递。
最后,onBindViewHolder()
传递一个ViewHolder对象,在该对象中,您将内容放入第一个中定义的所有字段中,并在第三个步骤中绑定。
至于你提到的例子,有一个错误。 onCreateViewHolder()
方法应如下所示:
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
// set the view's size, margins, paddings and layout parameters
...
ViewHolder vh = new ViewHolder((TextView)v); //You need a cast here
return vh;
}
或者ViewHolder应该定义一个期望View对象的构造函数(这实际上更正确):
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ViewHolder(View v) {
mTextView = (TextView) v.findViewById(/* some ID */);
}
}
答案 1 :(得分:0)
我也遇到了同样的错误,我可以通过遵循kelevandos指令并确保布局文件仅包含TextView来解决。
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text1"
android:layout_alignParentTop="true"
android:textSize="20sp"
/>