1

I use SuperSLiM library from Github
I need to use this library in nested RecyclerView, but when I put this RecyclerView which stick's it's header on top, in another RecyclerView, it seems that it misses it's properties. this is my adapter for root RecyclerView that in each row of that I have a RecyclerView and a TextView.

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {


        private Context mContext;
        private LayoutInflater mLayoutInflater;


        public Adapter(Context context) {

            this.mContext = context;
            this.mLayoutInflater = LayoutInflater.from(context);
        }


        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

            View view = mLayoutInflater.inflate(R.layout.row, viewGroup, false);
            ViewHolder viewHolder = new ViewHolder(view);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int position) {

            //
            RecyclerView mRecyclerView = viewHolder.mRecyclerView;
            TextView mTextView = viewHolder.mTextView;

            //

            mTextView.setText("pos: " + position);

            //set LayoutManager
            mRecyclerView.setLayoutManager(new NestedLinearLayoutManager(mContext));

            //set Adapter
            CountryNamesAdapter adapter = new CountryNamesAdapter(mContext, 18);
            adapter.setMarginsFixed(true);
            adapter.setHeaderDisplay(18);
            mRecyclerView.setAdapter(adapter);

        }

        @Override
        public int getItemCount() {
            return 10;
        }

        class ViewHolder extends RecyclerView.ViewHolder {

            TextView mTextView;
            RecyclerView mRecyclerView;

            public ViewHolder(View itemView) {
                super(itemView);

                mTextView = (TextView) itemView.findViewById(R.id.title);
                mRecyclerView = (RecyclerView) itemView.findViewById(R.id.list);


            }
        }

This is NestedLinearLayoutManager class for showing child RecyclerView nice.

public class NestedLinearLayoutManager extends LinearLayoutManager {

    public NestedLinearLayoutManager(Context context){
        super(context);
    }
    public NestedLinearLayoutManager(Context context, int orientation, boolean reverseLayout)    {
        super(context, orientation, reverseLayout);
    }

    private int[] mMeasuredDimension = new int[2];

    @Override
    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
                          int widthSpec, int heightSpec) {
        final int widthMode = View.MeasureSpec.getMode(widthSpec);
        final int heightMode = View.MeasureSpec.getMode(heightSpec);
        final int widthSize = View.MeasureSpec.getSize(widthSpec);
        final int heightSize = View.MeasureSpec.getSize(heightSpec);
        int width = 0;
        int height = 0;
        for (int i = 0; i < getItemCount(); i++) {
            measureScrapChild(recycler, i,
                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
                    mMeasuredDimension);

            if (getOrientation() == HORIZONTAL) {
                width = width + mMeasuredDimension[0];
                if (i == 0) {
                    height = mMeasuredDimension[1];
                }
            } else {
                height = height + mMeasuredDimension[1];
                if (i == 0) {
                    width = mMeasuredDimension[0];
                }
            }
        }
        switch (widthMode) {
            case View.MeasureSpec.EXACTLY:
                width = widthSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        switch (heightMode) {
            case View.MeasureSpec.EXACTLY:
                height = heightSize;
            case View.MeasureSpec.AT_MOST:
            case View.MeasureSpec.UNSPECIFIED:
        }

        setMeasuredDimension(width, height);
    }

    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
                                   int heightSpec, int[] measuredDimension) {
        View view = recycler.getViewForPosition(position);
        if (view != null) {
            RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
            int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
                    getPaddingLeft() + getPaddingRight(), p.width);
            int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
                    getPaddingTop() + getPaddingBottom(), p.height);
            view.measure(childWidthSpec, childHeightSpec);
            measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
            measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
            recycler.recycleView(view);
        }
    }
}

Does this library work in nested RecyclerView too?

Nava
  • 368
  • 2
  • 11

0 Answers0