RelativeLayout无法在LayoutInflator中强制转换为TextView

时间:2017-02-08 04:47:58

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

我一直关注制作RecyclerView的{​​{3}}指南,但我遇到了障碍。它提供的代码不是很清楚,但在构建自定义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来自哪里。他们没有在布局文件中指定它。所以,当我试图将该代码放入我的适配器时,它告诉我没有找到该符号。所以,我将其添加为我的TextView

的ID
<?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>

但我仍然无法在my_text_view中使用R.layout.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来自哪里,我该如何使用它?

2 个答案:

答案 0 :(得分:2)

基本上,当使用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"/>

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

答案 1 :(得分:0)

你正在做的错误是你试图给RelativeLayout里面的TextView充气。相反,首先要对整个布局进行充气,并尝试找出布局内可用的子视图。

例如,您的布局为item_recycle_layout.xml,首先将其展开并将其展开到View或直接投放到RelativeLayout,因为布局中的父布局是标识为{{1}的RelativeLayout }。

例如,您的项目布局为:

activity_recycle

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

<RelativeLayout
  .....
  ..... >


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

</RelativeLayout>