在 onCreateViewHolder 期间在 ViewHolder 项目内膨胀 FrameLayout

Inflating a FrameLayout inside a ViewHolder item during onCreateViewHolder

我正在尝试根据检索到的数据创建具有动态视图的自定义适配器。一切都设置好了,我可以区分即将到来的数据,甚至实现 getItemViewType 和我自己的 getItem 来相应地设置类型。

我拥有的:

@Override
public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    PostItemView v = (PostItemView)inflater.inflate(R.layout.post_item_view, parent, false);
    PostViewHolder postViewHolder = new PostViewHolder(v);
    return postViewHolder;
}

现在鉴于 getItemViewType 已实施并且 getViewTypeCount(不确定在 recyclerview 中是否真的需要)我认为它会选择正确的 viewType

PostItemView: 关注的 XML 布局部分如下所示:

...
<RelativeLayout
       android:id="@+id/post_wrapper"
       style="@style/Match">

        <include
            android:id="@+id/post_item_header_view"
            layout="@layout/post_item_header_view"/>

       <!--OLD XML includes this part and excludes FRAMELAYOUT-->
        <!--<include-->
            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="wrap_content"-->
            <!--android:id="@+id/post_item_image_view"-->
            <!--android:layout_below="@id/post_item_header_view"-->
            <!--layout="@layout/post_item_image_view"-->
            <!--android:layout_alignParentRight="true"-->
            <!--android:layout_alignParentEnd="true" />-->
       <FrameLayout
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:id="@+id/post_item_image_view"
           android:layout_below="@id/post_item_header_view"
           android:layout_alignParentRight="true"
           android:layout_alignParentEnd="true"></FrameLayout>
        <include
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/post_item_text_view"
            android:layout_below="@id/post_item_image_view"
            layout="@layout/post_item_text_view"/>
        <include
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/post_item_action_view"
            android:layout_below="@id/post_item_text_view"
            layout="@layout/post_item_action_view"/>

   </RelativeLayout>
...

在我膨胀 PostItemView 之后,我如何在它的子 FrameLayout 中为我迭代的每种类型(我有 6 个)膨胀特定布局?

还有其他方法吗?

这是一个动态方法:

假设你有自己的适配器,把它变成一个抽象 class 并创建一个名为 getDynamicView 的抽象方法(这不会是你的 FrameLayout,而是你想添加到它的布局).当您在 onCreateViewHolder.

中创建 PostItemView 对象时,您的 FrameLayout 将会膨胀

在实例化 ViewHolder 之前,您必须使用抽象方法获取视图,稍后您必须在子class(您最终将使用的适配器)中实现该方法。

@Override
public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    PostItemView v = (PostItemView)inflater.inflate(R.layout.post_item_view, parent, false);
    /**
     this is the abstract method, getDynamicParent will NOT be null as it 
     is already included in your XML and will be inflated as you 
     instantiate PostItemView. Use the viewType value to inflate the proper view
    **/
    View dynamicView = getDynamicView(viewType, v.getDynamicView, v.getDynamicParent);

    if(!dynamicView.equals(v.getDynamiView)){
      v.getDynamicParent.removeAllViews(); //not sure of method name
      v.getDynamicParent.addView(dynamicView); //ViewGroup method
    }

    //you will be using it to bind items to it.
    v.setDynamicView(dynamicView);

    PostViewHolder postViewHolder = new PostViewHolder(v);
    return postViewHolder;
} 

现在创建另一个名为 MyAdapter 的 class 来扩展这个,在构造函数中将上下文(我假设)传递给它并实现 getDynamicView().

就是这样。您当前的解决方案已完成 80%。您仍然可以在一个 class 中完成所有操作,但如果您决定稍后重新使用主适配器,这是一种更好的方法。