在 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 中完成所有操作,但如果您决定稍后重新使用主适配器,这是一种更好的方法。
我正在尝试根据检索到的数据创建具有动态视图的自定义适配器。一切都设置好了,我可以区分即将到来的数据,甚至实现 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
.
在实例化 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 中完成所有操作,但如果您决定稍后重新使用主适配器,这是一种更好的方法。