Самый простой способ добавить заголовок в RecyclerView (Android) - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь добавить заголовок к представлению переработчика с проблемами. То, как я сейчас пытаюсь это сделать, я обнаружил при переполнении стека, но у меня возникли проблемы с этим.

Декорация

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();
        }
    }
}

Это класс декорации, и он предлагает использовать эту команду без других модификаций:

recyclerView.addItemDecoration(new HeaderDecoration(this,
                               recyclerView,  R.layout.test_header));

Моя попытка реализации это выглядит следующим образом: Фрагмент. java

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.galway_fragment, container, false);

        recyclerView = (RecyclerView) v.findViewById(R.id.galway_recycler);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setHasFixedSize(true);
        MyAdapter adapter = new MyAdapter(placeNames);

        recyclerView.addItemDecoration(new HeaderDecoration(this.getContext(), recyclerView,  R.layout.stamp_header));

        recyclerView.setAdapter(adapter);
...
}

stamp_header. xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:background="@android:color/holo_blue_bright"
        android:text="HI THERE" />


</RelativeLayout>

Произошла ошибка: что сообщение заголовка в stamp_header отображается во фрагменте при запуске, но только в левом углу экрана и не совпадает с родительским (полная ширина), как это должно быть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...