RecyclerView 使用 GridLayoutManager 时,设置不同 viewtype 所占的 spanSize

15 篇文章 1 订阅
需求

当 RecyclerView 用于一行展示多个 item 时,会用到 GridLayoutManager .这时其他的 viewtype 可能仍然希望占据一整行,例如底部的加载更多view,如下图所示:
在这里插入图片描述

解决

  • 继承 GridLayoutManager.SpanSizeLookup() 类,重写 getSpanSize 方法.返回此item期望占据的 SpanSize
 		val layoutManager = GridLayoutManager(this, SPAN_COUNT)
        val spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int): Int {
               // 根据实际情况处理需要返回的值.
               //例如我的代码中不同data类型对应不同的viewtype. 因此客户根据数据类型返回
                val item = items[position]
                return if (item is NoMoreData) SPAN_COUNT else 1
            }
        }
        layoutManager.spanSizeLookup = spanSizeLookup

备注: getSpanSize(position: Int) 中的 position参数 是RecyclerView真正的位置控制. 即使是占据了多个 SpanSize ,本质上也是一个 position

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要隐藏RecyclerView中的特定项,可以使用RecyclerView的Adapter中的getItemViewType方法来指定不需要显示的项的视图类型。然后,在RecyclerViewLayoutManager使用setSpanSizeLookup方法来设置每个项的跨度大小,并在这个方法中根据视图类型返回相应的跨度大小。这将导致那些需要隐藏的项不会被显示出来,因为它们的跨度大小为0。 以下是一个示例代码,展示如何在网格布局中隐藏特定的项: ``` public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<MyItem> items; private int numColumns; public MyAdapter(List<MyItem> items, int numColumns) { this.items = items; this.numColumns = numColumns; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // Create and return the appropriate view holder for the given view type } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { // Bind the data to the view holder } @Override public int getItemCount() { return items.size(); } @Override public int getItemViewType(int position) { if (shouldHideItem(position)) { // Return a unique view type for the hidden item return R.layout.hidden_item; } else { // Return the normal view type for the non-hidden items return R.layout.normal_item; } } private boolean shouldHideItem(int position) { // Determine if the item at the given position should be hidden // For example, based on some condition or data in the item object return items.get(position).isHidden(); } public void hideItem(int position) { // Update the item object to indicate that it should be hidden items.get(position).setHidden(true); // Notify the adapter that the data set has changed notifyDataSetChanged(); } public void showItem(int position) { // Update the item object to indicate that it should be shown items.get(position).setHidden(false); // Notify the adapter that the data set has changed notifyDataSetChanged(); } public static class GridLayoutManagerWithHiddenItems extends GridLayoutManager { private MyAdapter adapter; public GridLayoutManagerWithHiddenItems(Context context, int spanCount, MyAdapter adapter) { super(context, spanCount); this.adapter = adapter; } @Override public SpanSizeLookup getSpanSizeLookup() { return new SpanSizeLookup() { @Override public int getSpanSize(int position) { if (adapter.getItemViewType(position) == R.layout.hidden_item) { // Return 0 for hidden items return 0; } else { // Return the normal span size for non-hidden items return 1; } } }; } } } ``` 在这个示例中,MyAdapter类是RecyclerView的Adapter,它包含一个getItemViewType方法来确定每个项的视图类型。如果shouldHideItem方法返回true,则该项的视图类型将设置为R.layout.hidden_item,否则为R.layout.normal_item。GridLayoutManagerWithHiddenItems类是RecyclerViewLayoutManager,它扩展了GridLayoutManager,并在getSpanSizeLookup方法中使用getItemViewType方法返回的视图类型来设置每个项的跨度大小。如果视图类型为R.layout.hidden_item,则跨度大小为0,否则为1。 要隐藏特定的项,可以调用MyAdapter中的hideItem方法,并传递该项的位置。这将更新相应的MyItem对象并通知适配器数据集已更改。要显示已隐藏的项,可以调用MyAdapter中的showItem方法,并传递该项的位置。这将更新相应的MyItem对象并通知适配器数据集已更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值