如何动态地在cardview内充气新布局

时间:2016-04-03 07:43:42

标签: android

我正在尝试动态扩充cardview中的第二个XML,但它会抛出空指针异常。当我尝试做硬代码时(通过直接包含在卡片视图布局中)它运行良好。有没有其他方法可以充气动态新XML?

CardView布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/room_detail_cards"
    android:layout_height="wrap_content">
    <LinearLayout
        android:id="@+id/room_detail_Linear_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include layout="@layout/module_type_5"/>
        <!--<include layout="@layout/module_type_3"/>-->
        <!--<It Works well when i hard code the layout here/>-->

</LinearLayout>
</android.support.v7.widget.CardView>

RecyclerAdapter.java(onCreateViewHolder)

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    layout= (LinearLayout) parent.findViewById(R.id.room_detail_Linear_layout);
    View itemView = LayoutInflater.
                from(parent.getContext()).
                inflate(R.layout.module_type_3, layout, false);
   layout.addView(itemView);             //NULL Pointer Exception occurs here
    View itemView1 = LayoutInflater.
            from(parent.getContext()).
            inflate(R.layout.room_detail_card_view, null, false);

    return new ViewHolder(itemView1);
}

第一个布局XML(module_type_5)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:hint="module"
        android:id="@+id/module_5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <LinearLayout
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>

第二个XML布局(module_type_3)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="5dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:hint="module"
        android:id="@+id/module_5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <LinearLayout
        android:padding="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:src="@drawable/add"
            android:id="@+id/switch_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</LinearLayout>

    </LinearLayout>

1 个答案:

答案 0 :(得分:0)

您在此处充气之前尝试获取view id

layout= (LinearLayout) parent.findViewById(R.id.room_detail_Linear_layout);

这就是布局为null的原因。

使用onCreateViewHolder返回ViewHolder的实例,并在视图持有者中执行所有分配。

这样的事情会起作用:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext())
            .inflate(R.layout.room_detail_card_view, parent, false));
}

然后在你的ViewHolder课程中:

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView textView;
    public ViewHolder(View itemView) {
        super(itemView);
        textView = (TextView)itemView.findViewById(R.id.textView);
    }
}

最后在onBindViewHolder中的数据绑定:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.textView.setText("some data")
}