在 StaggeredGridLayoutManager 中设置跨度
Setup span in StaggeredGridLayoutManager
我需要创建如下所示的视图(这是一个 iOS 屏幕截图,因为我已经创建了它)。
每个蓝色框都是 RecyclerView
线性布局的一部分,而每个绿色项都是交错布局的一部分。
我能够创建那个结构。问题是我不能让每个灰色框成为黄色框的一半。使用 StaggeredGridLayoutManager
我无法控制为内部回收器视图显示的框的跨度(大小)。只有 GridLayoutManager
有机会设置跨度大小查找。
需要的是根据容器的with计算箱子。例如:如果屏幕是99,那么黄色框应该是66,灰色框应该是33。
您对如何实现这一点有什么建议吗?
这里是我使用的代码片段:
public class BoxViewAdapter extends RecyclerView.Adapter<BoxViewAdapter.BoxViewHolder> {
private List<Box> mValues;
private Context mContext;
protected BoxViewAdapter.ItemListener mListener;
public BoxViewAdapter(Context context, List<Box> values, BoxViewAdapter.ItemListener itemListener) {
mValues = values;
mContext = context;
mListener = itemListener;
}
@Override
public BoxViewAdapter.BoxViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.box_view_item, parent, false);
return new BoxViewAdapter.BoxViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull BoxViewAdapter.BoxViewHolder holder, int position) {
holder.bind(mValues.get(position));
}
@Override
public int getItemCount() {
return mValues.size();
}
public interface ItemListener {
void onItemClick();
}
public class BoxViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public Box item;
private RecyclerView recyclerView;
public BoxViewHolder(View v) {
super(v);
v.setOnClickListener(this);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL);
recyclerView = v.findViewById(R.id.cardRecyclerView);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
}
public void bind(Box item) {
this.item = item;
recyclerView.setAdapter(new CardViewAdapter(itemView.getContext(), item.cards, null));
}
@Override
public void onClick(View view) {
if (mListener != null) {
mListener.onItemClick();
}
}
}
}
同时,我已经这样解决了。
在 CardViewAdapter
的 onBindViewHolder
中,我只是将 LayoutParams
设置为 itemView
。由于项目视图是在 RecyclerView
内呈现的,StaggeredGridLayoutManager
知道如何处理它。
@Override
public void onBindViewHolder(@NonNull CardViewHolder viewHolder, int position) {
if (mUseLayoutParameters) {
int singleScreenWidth = DisplayUtils.getScreenWidth() / 3;
Card card = mValues.get(position);
if (card.isDoubleSized) {
singleScreenWidth = singleScreenWidth * 2;
}
StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(singleScreenWidth, ViewGroup.LayoutParams.MATCH_PARENT);
viewHolder.itemView.setLayoutParams(layoutParams);
}
viewHolder.bind(mValues.get(position));
}
我需要创建如下所示的视图(这是一个 iOS 屏幕截图,因为我已经创建了它)。
每个蓝色框都是 RecyclerView
线性布局的一部分,而每个绿色项都是交错布局的一部分。
我能够创建那个结构。问题是我不能让每个灰色框成为黄色框的一半。使用 StaggeredGridLayoutManager
我无法控制为内部回收器视图显示的框的跨度(大小)。只有 GridLayoutManager
有机会设置跨度大小查找。
需要的是根据容器的with计算箱子。例如:如果屏幕是99,那么黄色框应该是66,灰色框应该是33。
您对如何实现这一点有什么建议吗?
这里是我使用的代码片段:
public class BoxViewAdapter extends RecyclerView.Adapter<BoxViewAdapter.BoxViewHolder> {
private List<Box> mValues;
private Context mContext;
protected BoxViewAdapter.ItemListener mListener;
public BoxViewAdapter(Context context, List<Box> values, BoxViewAdapter.ItemListener itemListener) {
mValues = values;
mContext = context;
mListener = itemListener;
}
@Override
public BoxViewAdapter.BoxViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.box_view_item, parent, false);
return new BoxViewAdapter.BoxViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull BoxViewAdapter.BoxViewHolder holder, int position) {
holder.bind(mValues.get(position));
}
@Override
public int getItemCount() {
return mValues.size();
}
public interface ItemListener {
void onItemClick();
}
public class BoxViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public Box item;
private RecyclerView recyclerView;
public BoxViewHolder(View v) {
super(v);
v.setOnClickListener(this);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL);
recyclerView = v.findViewById(R.id.cardRecyclerView);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
}
public void bind(Box item) {
this.item = item;
recyclerView.setAdapter(new CardViewAdapter(itemView.getContext(), item.cards, null));
}
@Override
public void onClick(View view) {
if (mListener != null) {
mListener.onItemClick();
}
}
}
}
同时,我已经这样解决了。
在 CardViewAdapter
的 onBindViewHolder
中,我只是将 LayoutParams
设置为 itemView
。由于项目视图是在 RecyclerView
内呈现的,StaggeredGridLayoutManager
知道如何处理它。
@Override
public void onBindViewHolder(@NonNull CardViewHolder viewHolder, int position) {
if (mUseLayoutParameters) {
int singleScreenWidth = DisplayUtils.getScreenWidth() / 3;
Card card = mValues.get(position);
if (card.isDoubleSized) {
singleScreenWidth = singleScreenWidth * 2;
}
StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(singleScreenWidth, ViewGroup.LayoutParams.MATCH_PARENT);
viewHolder.itemView.setLayoutParams(layoutParams);
}
viewHolder.bind(mValues.get(position));
}