首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RecyclerView中的全宽度页脚或最后一项使用StaggeredGridLayout

使用RecyclerView中的全宽度页脚或最后一项使用StaggeredGridLayout
EN

Stack Overflow用户
提问于 2020-09-11 16:08:29
回答 3查看 396关注 0票数 1

所以这很棘手。我发现最接近这个功能的是这个answer的修改版本。在这里,我使最后一个项目的高度与视图相同,我希望是完全宽度和不可见的。然后添加一个项目装饰,并将其绘制为列表中的最后一项应该可见的位置,如下所示:

代码语言:javascript
复制
class StickyDecoration (private val stickyView: View) : ItemDecoration() {

    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        super.onDraw(c, parent, state)

        // layout basically just gets drawn on the reserved space on top of the first view
        stickyView.layout(parent.left, 0, parent.right, stickyView.measuredHeight)
        for (i in 0 until parent.childCount) {
            val view: View = parent.getChildAt(i)
            if (parent.getChildAdapterPosition(view) == parent.childCount - 1) {
                c.save()

                val rectf = Rect()
                view.getGlobalVisibleRect(rectf)
                c.translate(0f, (rectf.top).toFloat())

                stickyView.draw(c)
                c.restore()
                break
            }
        }
    }

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        outRect.setEmpty()
    }
}

这种方法的问题是,当最后一个回收视图上的物品从视图中消失时,rectf.topview.top的值或我能想到的任何度量值都会发生飞跃,并取代最后一个项目。

有没有人知道用StaggeredGridLayoutManager在回收视图中添加一个完整宽度的最后一个项目或页脚的方法?我知道它适用于Gridlayout,但在我的情况下它不是一个选项。

或者,如果您知道一个值,它可以在不跳转的情况下纠正屏幕上最后一项的位置?

编辑:

更多关于我想达到的目标的细节。

它应该是一个StaggeredGridLayout,它的页脚在最后一项下面,它是完全宽度的,并与其他内容一起滚动。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-14 10:05:17

若要在recyclerView中使用StaggeredGridLayoutManager制作全宽度页脚,可以执行以下操作。创建一个自定义ItemDecoration:

代码语言:javascript
复制
class FooterDecoration (private val footerView: View) : ItemDecoration() {

    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        super.onDraw(c, parent, state)

        footerView.layout(parent.left, 0, parent.right, footerView.measuredHeight)
        val count = parent.adapter!!.itemCount

        val view: View = parent.getChildAt(parent.childCount - 1)
        if (parent.getChildAdapterPosition(view) == count - 1) {
            c.save()

            val rect = Rect()
            view.getGlobalVisibleRect(rect)
            c.translate(0f, (rect.top).toFloat())

            footerView.draw(c)
            c.restore()
        }
    }
}

然后在recyclerView中膨胀要使用的视图,并将其添加为项装饰:

代码语言:javascript
复制
recyclerView.apply {
    val footerView: View = LayoutInflater.from(context).inflate(R.layout.item_footer_placeholder, this, false)
    val measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
    footerView.measure(measureSpec, measureSpec)
    addItemDecoration(ServicesFooterDecoration(footerView))

}
票数 0
EN

Stack Overflow用户

发布于 2020-10-15 05:03:58

在适配器中,您可以为页脚UI添加如下条件:

代码语言:javascript
复制
@Override
    public int getItemViewType(int position) {
        if (// normal UI) {
            return VIEW_TYPE_NORMAL;
        } else {
            return VIEW_TYPE_FOOTER;
        }
    }

onBindViewHolder中,您可以为VIEW_TYPE_FOOTER.添加如下内容

代码语言:javascript
复制
StaggeredGridLayoutManager.LayoutParams layoutParams =
                        (StaggeredGridLayoutManager.LayoutParams) ((YourViewHolder) holderType).itemView.getLayoutParams();
                /*
                 * to make View to occupy full width of the parent
                 */
                layoutParams.setFullSpan(true);
票数 1
EN

Stack Overflow用户

发布于 2020-11-03 10:17:24

onBindViewHolder中使用isFullSpan

代码语言:javascript
复制
override fun onBindViewHolder(holder: LoadStateViewHolder, loadState: LoadState) {
        holder.bind(loadState)
        val layoutParams = holder.itemView.layoutParams as StaggeredGridLayoutManager.LayoutParams
        layoutParams.isFullSpan = true
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63850625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档