Android 创建时不得附着ViewHolder视图

Android 创建时不得附着ViewHolder视图,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,我正在尝试创建一个简单的RV,它将显示文本视图。 这是我的适配器: public class MyRvAdapter extends RecyclerView.Adapter<MyRvAdapter.ViewHolder> { private String[] mDataset; public static class ViewHolder extends RecyclerView.ViewHolder { // each data item is just a str

我正在尝试创建一个简单的RV,它将显示文本视图。 这是我的适配器:

public class MyRvAdapter extends RecyclerView.Adapter<MyRvAdapter.ViewHolder> {

private String[] mDataset;


public static class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public TextView mTextView;
    public ViewHolder(TextView v) {
        super(v);
        mTextView = v;
    }
}

public MyRvAdapter(String[] myDataset) {
    mDataset = myDataset;
}

@NonNull
@Override
public MyRvAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.text_row_item, parent, false);
    TextView userNameInList= v.findViewById(R.id.display_name);
    ViewHolder vh = new ViewHolder(userNameInList);
    return vh;
    }

@Override
public void onBindViewHolder(@NonNull MyRvAdapter.ViewHolder holder, int position) {
    holder.mTextView.setText(mDataset[position]);
}

@Override
public int getItemCount() {
    return mDataset.length;
}

多谢各位

实际上,您的
ViewHolder
需要一个
视图
R.layout.text\u row\u项目
膨胀而来,而不是后者的后代。因此,如果您通过膨胀视图,问题将得到解决

因此,您应该将代码更正为:

public class MyRvAdapter extends RecyclerView.Adapter<MyRvAdapter.ViewHolder> {

    private String[] mDataset;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView mTextView;
        public ViewHolder(View v) {
            super(v);
            mTextView = v.findViewById(r.id.display_name);
        }
    }

    public MyRvAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    @NonNull
    @Override
    public MyRvAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.text_row_item, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(@NonNull MyRvAdapter.ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}
公共类MyrAdapter扩展了RecyclerView.Adapter{ 私有字符串[]mDataset; 公共静态类ViewHolder扩展了RecyclerView.ViewHolder{ //在本例中,每个数据项只是一个字符串 公共文本视图mTextView; 公共视图持有者(视图v){ 超级(五); mTextView=v.findviewbyd(r.id.display\u name); } } 公共MyrAdapter(字符串[]myDataset){ mDataset=myDataset; } @非空 @凌驾 public MyRvAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int viewType){ 视图v=LayoutInflater.from(parent.getContext()) .充气(R.layout.text\u row\u项目,父项,false); 视窗支架vh=新视窗支架(v); 返回vh; } @凌驾 public void onBindViewHolder(@NonNull MyRvAdapter.ViewHolder,int位置){ holder.mTextView.setText(mDataset[position]); } @凌驾 public int getItemCount(){ 返回mDataset.length; } }
等待视图创建后再绑定

删除
TextView userNameInList=v.findviewbyd(R.id.display\u name)从您的
MyrAdapter.ViewHolder

并将
ViewHolder
绑定为
mTextView=v.findViewById(r.id.display\u name)

试试这个

public class MyRvAdapter extends RecyclerView.Adapter<MyRvAdapter.MyViewHolder> {

private Context mContext;
private String[] mDataset;

public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView title;

    MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.display_name);
    }
}

public MyRvAdapter(Context mContext, String[] myDataset) {
    this.mContext = mContext;
    this.mDataset = myDataset;
}


@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_row_item, parent, false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    holder.title.setText(mDataset[position]);
}

@Override
public int getItemCount() {
    return mDataset.length;
}
}
公共类MyrAdapter扩展了RecyclerView.Adapter{ 私有上下文; 私有字符串[]mDataset; 公共类MyViewHolder扩展了RecyclerView.ViewHolder{ 文本视图标题; MyViewHolder(视图){ 超级(视图); title=(TextView)view.findViewById(R.id.display\u name); } } 公共MyrAdapter(上下文mContext,字符串[]myDataset){ this.mContext=mContext; this.mDataset=myDataset; } @凌驾 公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ View itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.text\u row\u item,parent,false); 返回新的MyViewHolder(itemView); } @凌驾 公共无效onBindViewHolder(最终MyViewHolder,最终int位置){ holder.title.setText(mDataset[位置]); } @凌驾 public int getItemCount(){ 返回mDataset.length; } }
在我的情况下,我修改了这一行

val view = parent.inflate(R.layout.your_item)


我知道为时已晚,但我想补充我的答案,因为它可以帮助任何人谁是面对这个问题不是由于上述原因。 在我的例子中,我使用的是“数据绑定库”,我的错误是我的根元素不是



如果您能指出a,那就太好了。错误是什么,b。您的解决方案是如何修复的。@asco感谢您的评论。我添加了一个额外的解释。谷歌Android指南将文本视图传递给它,但这是直接膨胀的文本视图,我也感到困惑。谢谢他已经将attachToRoot设置为false,所以这是一个不同的问题。我理解你的观点@ohgodnotanotherone,他的问题不同,但error的名称与我的问题相同。所以这就是我提出的理由:在我的例子中,我修改了这一行。
val view = parent.inflate(R.layout.your_item)
val view = parent.inflate(R.layout.your_item, false)
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

        <data>

            <variable
                name="viewmodel"
                type="com.myapp.data.ViewModel" />
        </data>
        <!-- UI layout's root element -->
        <ConstraintLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <FrameLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
                <!-- By Mistake i was Making this element as Root -->
            </FrameLayout>
        </ConstraintLayout>

    </layout>