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

时间:2015-05-17 19:14:50

标签: java android android-recyclerview custom-adapter

我正在尝试根据检索到的数据创建具有动态视图的自定义适配器。一切都已设置好,我可以区分即将发布的数据,甚至可以实现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之后,我如何在迭代它的每种类型(我有6个)时为其子FrameLayout中的特定布局充气?

还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

这是一种动态方法:

假设您有自己的适配器,将其转换为抽象类并创建一个名为getDynamicView的抽象方法(这不是您的FrameLayout,而是要添加到它的布局)。当您在onCreateViewHolder中创建 PostItemView 对象时,您的FrameLayout将会膨胀。

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

@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的类,它将扩展这个类,在构造函数中传递给它上下文(我假设)并实现getDynamicView()

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