我正在尝试实施以下图片。我的第一个想法是让网格布局上方的所有内容都是网格的第一行,并使用SpanSizeLookup将跨度大小设置为RecyclerView中的列数,但这感觉就像是会给我带来很多问题。< / p>
我一直在阅读将RecyclerView放在NestedScrollView中,人们说它有效,但我似乎无法让它正常工作。滚动似乎不正常,我不能让网格甚至在没有设置minHeight的情况下显示,但是它看起来很糟糕。
还有其他选择我没有考虑,或者是我应该采取的方向之一吗?
答案 0 :(得分:18)
您对SpanSizeLookup有何期待?您可以使用以下几行来实现它(我建议使用integers.xml中的值来获得灵活性)。
GridLayoutManager glm = new GridLayoutManager(getContext(), 3);
glm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override public int getSpanSize(int position) {
return (position == 0) ? 3 : 1;
}
});
如果标题布局需要常规布局所没有的视图和字段,则需要创建单独的视图并告知适配器。这样的事情。
@Override
public int getItemViewType(int position) {
if (position == 0)
return TYPE_HEADER;
else
return TYPE_REGULAR;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
MyHeaderView view = (MyHeaderView) LayoutInflater
.from(parent.getContext())
.inflate(R.layout.my_header_view, parent, false);
return new MyHeaderViewHolder(view);
} else {
MyRegularView view = (MyRegularView) LayoutInflater
.from(parent.getContext())
.inflate(R.layout.my_regular_view, parent, false);
return new MyRegularViewHolder(view);
}
}
示例标题视图可能是这样的(您从bindTo()
调用MyHeaderViewHolder
)。
public final class MyHeaderView extends LinearLayout {
@Bind(R.id.image) ImageView imageView;
@Bind(R.id.title) TextView titleView;
public MyHeaderView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
ButterKnife.bind(this);
}
public void bindTo(String imageUrl, String title) {
Glide.with(getContext())
.load(imageUrl).into(imageView);
titleView.setText(title);
}
}
答案 1 :(得分:3)
这使得该项目与RecyclerView本身一样宽(类似于match_parent)。
在负责此项目的特定ViewHolder中设置各种点击侦听器。使用这种方法可以将整个复杂视图设置为在RecyclerView中表现(滚动),同时仍然可以将其用于(输入)事件。
答案 2 :(得分:1)
您可以查看Bookends
或另一种(我通常这样做的方式)方式是使用带有SpanSizeLookUp的GridLayouManager。并使用多个ViewTypes,即一个用于页眉,页脚和项目。
如果您的代码中只有一个标题以及 ListView-ish 界面,请转到1.
如果您不确定要添加多少个自定义视图类型,请转到2.确保您将来具有最大的可扩展性。
如果您正在考虑大规模的可扩展性,我建议您阅读Hannes Dorfman撰写的this article。