我在我的安卓应用程序里放了一个RecyclerView
。所以,就像我在所有关于回收者视图的文档中一样,我有一个Adapter
类,其中定义了一个ViewHolder
类。该代码如下所示(在PointChangeAdapter.java
中)。
但是,我的代码和我所见过的大多数教程有一个不同之处:我没有一个xml
文件为我的ViewHolder
定义布局。至少这就是我想要得到的工作。
我似乎不需要定义自定义布局,因为我的RecyclerView
的元素只是TextView
的元素,这很可能是用ListView来完成的,但是我喜欢RecyclerView
的灵活性,我只是想了解是否有可能实现这里的功能。也就是说,与回收商和没有xml
布局。
为了适应xml
布局的不足,我修改了Adapter的onCreateViewHolder
方法。其中一个典型的例子将使用布局充气器,例如。
@Override
public PointChangeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final TextView textView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_viewholder_xml_layout, parent, false);
return new PointChangeViewHolder(textView);
}
我反而有
@Override
public PointChangeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final TextView textView = new TextView(parent.getContext());
parent.addView(textView);
return new PointChangeViewHolder(textView);
}
也就是说,我不是在xml布局上调用inflate
并指定RecyclerView
父级,而是创建一个新的TextView
,并通过addView
直接将其添加到RecyclerView
父节点。
唯一的问题是这不起作用。
它给了我一个“创建时不能附加ViewHolder视图”的错误:
E/AndroidRuntime:致命异常:主进程: com.mherzl.pointcounter,PID: 5253 java.lang.IllegalStateException: ViewHolder视图在创建时不能附加。确保您没有将'true‘传递给androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7080)上的LayoutInflater.inflate(.,boolean )的attachToRoot参数 ..。
我还尝试完全删除parent.addView(textView);
行,使我的示例与这示例几乎相同,与我试图做的一样,该示例没有指定xml
布局。当我在没有addView
行的情况下运行我的代码时,我不会得到错误,但是在这种情况下,文本仍然不会出现在回收器视图中。所以有些事情看起来也不对劲。此外,我认为应该需要addView
行;由于充气器似乎将TextView
附加到RecyclerView
父节点,所以我用它替换的充气器似乎也应该附加到它上。
是否可以使用RecyclerView
作为元素,而不是使用自定义TextView
布局定义的元素来制作xml?
这是我的代码:
PointChangeAdapter.java
package com.mherzl.pointcounter;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class PointChangeAdapter extends RecyclerView.Adapter<PointChangeAdapter.PointChangeViewHolder> {
private List<Integer> recentChanges;
public PointChangeAdapter(List<Integer> recentChanges) {
this.recentChanges = recentChanges;
}
@Override
public int getItemCount() {
if (recentChanges == null) {
return 0;
}
return recentChanges.size();
}
@Override
public PointChangeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final TextView textView = new TextView(parent.getContext());
parent.addView(textView);
return new PointChangeViewHolder(textView);
}
@Override
public void onBindViewHolder(PointChangeViewHolder holder, int position) {
final int pointChange = recentChanges.get(position);
String text = Integer.toString(pointChange);
holder.setText(text);
}
public static class PointChangeViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public PointChangeViewHolder(TextView textView) {
super(textView);
this.textView = textView;
}
public void setText(String text) {
textView.setText(text);
}
}
}
下面是运行它的方法--在片段的onCreateView
中使用RecyclerView
RecyclerView pointChangeRecycler =
(RecyclerView) view.findViewById(R.id.point_changes_recycler);
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
pointChangeRecycler.setLayoutManager(layoutManager);
List<Integer> myList = new ArrayList<>();
myList.add(1); myList.add(2); myList.add(3);
PointChangeAdapter pointChangeAdapter = new PointChangeAdapter(myList);
pointChangeRecycler.setAdapter(pointChangeAdapter);
发布于 2022-04-08 04:03:47
是。onCreateViewHolder只是返回一个以ViewGroup (甚至可能只是一个视图)作为根视图的ViewHolder。
你的问题是你把它加到了父母身上。你不会想那样做的。RecyclerView最终将成为它的父级。您应该创建它,并返回一个以该视图作为根视图的holder。
是的,即使父传递进来的可能(虽然不一定)也是RecyclerView。回收器视图的布局管理器执行添加操作。这就是为什么最后一个调用的参数为false的原因--防止通货膨胀将其添加到父调用中。
https://stackoverflow.com/questions/71791304
复制相似问题