【问题标题】:RelativeLayout cannot be cast to TextView in LayoutInflator在 LayoutInflater 中,RelativeLayout 无法转换为 TextView
【发布时间】:2017-02-08 04:47:57
【问题描述】:

我一直在关注this 制作RecyclerView 的指南,但我遇到了障碍。它给出的代码不是很清楚,但是在构建自定义Recyclerview.Adpater时,它有这个方法:

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    // create a new view
    TextView v = (TextView) 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(v);
    return vh;
}

现在,我似乎无法弄清楚R.layout.my_text_view 的来源。他们没有在布局文件中指定它。因此,当我尝试将该代码放入我的适配器时,它告诉我找不到该符号。所以,我将它作为 id 添加到我的TextView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_recycle"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".recycle.RecycleActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".recycle.RecycleActivity"/>

    <include
        layout="@layout/toolbar_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/my_text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

但我仍然无法在R.layout.my_text_view 中使用my_text_view,因为它仍然找不到它。我也试过R.id.my_text_view,它可以找到它,但它说它需要一个布局,而不是一个ID。所以我尝试像这样使用R.layout.activity_recycle

@Override
public RecycleViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    // create a new view
    TextView v = (TextView) LayoutInflater.from(parent.getContext())
            .inflate(R.layout.activity_recycle, parent, false);
    // set the view's size, margins, paddings and layout parameters

    return new ViewHolder(v);
}

但这不起作用,我得到了异常:

java.lang.ClassCastException: android.widget.RelativeLayout 无法转换为 android.widget.TextView

我错过了什么?这个神秘的my_text_view是从哪里来的,怎么用?

【问题讨论】:

  • R.layout.activity_recycle 是布局 textview 不采取布局。它将采用布局项目 ID。
  • R.layout.my_text_view 类似于布局或卡片,会在您的回收站视图上膨胀,与列表项相同
  • 查看此答案并遵循该教程stackoverflow.com/a/41499210/7130121

标签: android android-layout android-recyclerview classcastexception layout-inflater


【解决方案1】:

基本上在使用 RecyclerView.Adapter 的 onCreateViewHolder 时,它会将 viewholder 返回到列表项的视图。 ViewHolder 用于扩充 RecyclerView 中的单个列表项(或行)。

您应该为要添加到 RecyclerView 的列表项创建布局。 例如 R.layout.my_text_view 应该只包含这个 TextView :

<TextView
    android:id="@+id/my_text_view_detail"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

现在您可以使用与上面相同的其余代码了。

【讨论】:

    【解决方案2】:

    您正在做的错误是您试图膨胀相对布局内的 TextView。相反,首先膨胀整个布局并尝试找出布局内可用的子视图。

    例如,您的布局是item_recycle_layout.xml,首先对其进行膨胀并将其转换为View 或直接转换为RelativeLayout,因为您的布局中的父布局是ID 为activity_recycle 的RelativeLayout。

    例如,您的项目布局是:

    <RelativeLayout
      .....
      ..... >
    
    
        <TextView
            android:id="@+id/my_text_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </RelativeLayout>
    

    现在下面的代码应该在您的适配器中:

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new view
        RelativeLayout v = (RelativeLayout) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_recycle_layout, parent, false);
        TextView txtView = (TextView) v.findViewById(R.id.my_text_view);
    
        ....
        ....
    
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }
    

    【讨论】:

    • 那么应该我的布局是什么样的?
    • 投反对票的,请说明投反对票的原因!
    • 这更有意义。但是,现在我看到错误“指定的孩子已经有父母。您必须先在孩子的父母上调用 removeView()。”
    • 您是否创建了一个名为 item_recycle_layout 或您想提供的任何名称的单独 xml 文件?如答案中所述
    • 是的。它看起来很像您在答案中输入的那个。只是 TextViewRelativeLayout 内。
    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多