【问题标题】:Inflating a FrameLayout inside a ViewHolder item during onCreateViewHolder在 onCreateViewHolder 期间在 ViewHolder 项内膨胀 FrameLayout
【发布时间】:2015-05-17 19:14:49
【问题描述】:

我正在尝试根据检索到的数据创建具有动态视图的自定义适配器。一切都设置好了,我可以区分即将到来的数据,甚至实现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 中膨胀特定布局?

还有其他方法吗?

【问题讨论】:

    标签: java android android-recyclerview custom-adapter


    【解决方案1】:

    这是一种动态方法:

    假设您有自己的适配器,将其转换为抽象类并创建一个名为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%。您仍然可以在一个类中完成所有操作,但如果您决定稍后重新使用您的主适配器,这是一种更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多