我使用列表中的子元素实现了一个可扩展的recyclerview。我遵循了这个准则。这就是它的工作原理,
下面简要描述使用RecyclerView实现ExpandableListView。列表模型有一个附加参数“type”,用于标识项目是标题还是子项。通过检查此参数,适配器将根据类型为view和viewholder充气。如果类型为HEADER,它将扩展HEADER项的布局,其中包含一个TextView和一个ImageView,用于指示子树是否展开。
现在,我要做的是将展开的布局设置为网格。我通常会通过将布局管理器设置为GridLayoutManager来实现这一点,但在这种情况下,我只使用一个recyclerview,这意味着我无法在不更改标题的情况下更改布局管理器,最终导致整个recyclerview变成包含标题的网格。
我的问题是:如何在适配器内仅为几个布局更改布局管理器?
编辑:我添加了一些代码。
Recyclerview适配器:
public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// These are constants that are used to determine if the item is a child or a header and is defined with each item from the data model
public static final int HEADER = 0;
public static final int CHILD = 1;
private List<Item> data;
public ExpandableListAdapter(List<Item> data) {
this.data = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
View view = null;
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Check whether the item is a header or child and inflate differnet layouts
switch (type) {
case HEADER:
// Inflate a header layout if the item is a header
view = inflater.inflate(R.layout.list_header, parent, false);
ListHeaderViewHolder header = new ListHeaderViewHolder(view);
return header;
case CHILD:
// Inflate a child layout if the item is a child
view = inflater.inflate(R.layout.list_child, parent, false);
ListChildViewHolder child = new ListChildViewHolder(view);
return child;
}
return null;
}
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final Item item = data.get(position);
// Bind different layouts based on if the item is a header or child
switch (item.getType()) {
case HEADER:
// ...
case CHILD:
// ...
}
}
@Override
public int getItemViewType(int position) {
return data.get(position).type;
}
@Override
public int getItemCount() {
return data.size();
}
// Viewholder for the header items
private static class ListHeaderViewHolder extends RecyclerView.ViewHolder {
// ...
}
// Viewholder for the child items
private static class ListChildViewHolder extends RecyclerView.ViewHolder {
// ...
}
这是我声明布局管理器的主要活动:
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
将布局管理器更改为gridlayout管理器,并按如下所述处理跨度大小
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type=mAdapter.getItemViewType(position);
if (type == "view holder type name")
return 2;
else
return 1;
}
});
您可以将布局管理器更改为GridLayoutManager并为标头定义“跨度大小”,例如,如果您想要具有2列的网格,则标头应具有跨度大小2和子跨度大小1:
GridLayoutManager glm = new GridLayoutManager(getContext(), 2);
glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch(getTypeForPosition(position)) {
case HEADER:
return 2;
default:
return 1;
}
}
});
recyclerView.setLayoutManager(glm);
这里有一个使用这个库的带有标头的可扩展网格的完整示例。
根据Building a RecolyerView LayoutManager文章,我已经为RecolyerView创建了自己的自定义布局管理器,但是由于现有的一些文档,我无法找到从布局管理器中强制RecolyView重建动画的方法(就像使用notifyItemInserted或notifyItemDeleted时的动画一样)。这些动画由recyclerView及其项目动画师控制,开发人员只能控制
*label1:combo1 label2:combo2 label3:combo3 label4:text1 label5:text2 label6:text3*
我需要在中制作这样的表。 有什么想法如何做到这一点,以获得像下面图片上的布局吗?
我需要用动画更改RecyclerView的GridLayoutManager跨距计数,但当用户在RecyclerView布局上做出收缩或缩放手势时,我需要这样做。动画应缓慢且持续地跟随用户的手势,直到用户从屏幕上松开手指。
英文原文:http://emberjs.com/guides/views/adding-layouts-to-views/ 视图可以拥有一个次模板来包裹其主模板。如同模板一样,布局是可以插入到视图标签下的Handlebars模板。 通过设置layoutName属性来配置视图的布局模板。 而布局模板通过Handlebars的{{yield}}助手来指定在哪里插入主模板。视图渲染后的template的
我试图使用创建一个厨房显示系统,并试图找出一种方法,当第一行已经满了时,在第二行添加另一个面板。GUI的宽度将根据用户的喜好而改变。当更宽时,它应该每行显示更多的组件。