首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以在没有ViewHolder布局的情况下进行回收视图吗?

我可以在没有ViewHolder布局的情况下进行回收视图吗?
EN

Stack Overflow用户
提问于 2022-04-08 03:18:07
回答 1查看 386关注 0票数 1

我在我的安卓应用程序里放了一个RecyclerView。所以,就像我在所有关于回收者视图的文档中一样,我有一个Adapter类,其中定义了一个ViewHolder类。该代码如下所示(在PointChangeAdapter.java中)。

但是,我的代码和我所见过的大多数教程有一个不同之处:我没有一个xml文件为我的ViewHolder定义布局。至少这就是我想要得到的工作。

我似乎不需要定义自定义布局,因为我的RecyclerView的元素只是TextView的元素,这很可能是用ListView来完成的,但是我喜欢RecyclerView的灵活性,我只是想了解是否有可能实现这里的功能。也就是说,与回收商和没有xml布局。

为了适应xml布局的不足,我修改了Adapter的onCreateViewHolder方法。其中一个典型的例子将使用布局充气器,例如。

代码语言:javascript
运行
复制
    @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);
    }

我反而有

代码语言:javascript
运行
复制
    @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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-08 04:03:47

是。onCreateViewHolder只是返回一个以ViewGroup (甚至可能只是一个视图)作为根视图的ViewHolder。

你的问题是你把它加到了父母身上。你不会想那样做的。RecyclerView最终将成为它的父级。您应该创建它,并返回一个以该视图作为根视图的holder。

是的,即使父传递进来的可能(虽然不一定)也是RecyclerView。回收器视图的布局管理器执行添加操作。这就是为什么最后一个调用的参数为false的原因--防止通货膨胀将其添加到父调用中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71791304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档