为了账号安全,请及时绑定邮箱和手机立即绑定

RecyclerView页眉和页脚

RecyclerView页眉和页脚

慕的地10843 2019-09-24 10:56:51
也许以前有人问过这个问题,但我似乎找不到确切的答案或解决方案。我开始使用RecyclerView,并使用LinearLayoutManager实施了它。现在,我想添加自定义的页眉和页脚项目,这些项目与RecyclerView中的其余项目不同。页眉和页脚不应发粘,我希望它们与其余项目一起滚动。可以有人指出如何做到这一点或只是分享想法的例子。我会非常感激。谢谢
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

在您的适配器中添加此类:


private class VIEW_TYPES {

        public static final int Header = 1;

        public static final int Normal = 2;

        public static final int Footer = 3;

}

然后覆盖这样的以下方法:


@Override

public int getItemViewType(int position) {


    if(items.get(position).isHeader)

        return VIEW_TYPES.Header;

    else if(items.get(position).isFooter)

        return VIEW_TYPES.Footer;

    else

        return VIEW_TYPES.Normal;


}

现在,在onCreateViewHolder方法中,根据视图类型为您的布局充气:


@Override

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {


    View rowView;


    switch (i) {


        case VIEW_TYPES.Normal:

            rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.normal, viewGroup, false);

            break;

        case VIEW_TYPES.Header:

            rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header, viewGroup, false);

            break;

        case VIEW_TYPES.Footer:

            rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.footer, viewGroup, false);

            break;

        default:

            rowView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.normal, viewGroup, false);

            break;

    }

    return new ViewHolder (rowView);

}

现在,在onBindViewHolder方法中,基于视图持有者绑定布局:


@Override

    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {


        int viewType = getItemViewType(position);


        switch(viewType) {


            case VIEW_TYPES.Header: // handle row header

                break;

            case VIEW_TYPES.Footer: // handle row footer

                break;

            case VIEW_TYPES.Normal: // handle row item

                break;


        }


    }

希望这会有所帮助。


查看完整回答
反对 回复 2019-09-24
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

使用ItemDecorations无需修改任何其他代码,这非常容易:


recyclerView.addItemDecoration(new HeaderDecoration(this,

                               recyclerView,  R.layout.test_header));

保留一些用于绘制的空间,填充要绘制的布局,然后在保留的空间中绘制它。


装饰代码:


public class HeaderDecoration extends RecyclerView.ItemDecoration {


    private View mLayout;


    public HeaderDecoration(final Context context, RecyclerView parent, @LayoutRes int resId) {

        // inflate and measure the layout

        mLayout = LayoutInflater.from(context).inflate(resId, parent, false);

        mLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),

                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

    }



    @Override

    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

        super.onDraw(c, parent, state);

        // layout basically just gets drawn on the reserved space on top of the first view

        mLayout.layout(parent.getLeft(), 0, parent.getRight(), mLayout.getMeasuredHeight());

        for (int i = 0; i < parent.getChildCount(); i++) {

            View view = parent.getChildAt(i);

            if (parent.getChildAdapterPosition(view) == 0) {

                c.save();

                final int height = mLayout.getMeasuredHeight();

                final int top = view.getTop() - height;

                c.translate(0, top);

                mLayout.draw(c);

                c.restore();

                break;

            }

        }

    }


    @Override

    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

        if (parent.getChildAdapterPosition(view) == 0) {

            outRect.set(0, mLayout.getMeasuredHeight(), 0, 0);

        } else {

            outRect.setEmpty();

        }

    }

}


查看完整回答
反对 回复 2019-09-24
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您可以使用此GitHub]库以RecyclerView最简单的方式向您的页面添加页眉或页脚。


您需要在项目中添加HFRecyclerView库,也可以从Gradle中获取它:


compile 'com.mikhaellopez:hfrecyclerview:1.0.0'

该库基于@hister的工作


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 554 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信