Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android nested recyclerview

I m trying to display nested recyclerview but the child items does not display. I want to display different items in all child view. I don't get a error, but the view is not refreshed.

Here is my code can any one help.

Thanks

    public class MainActivity extends ActionBarActivity {

    RecyclerView recyclerView;
    RootAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new RootAdapter(this);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerRoot);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

    }

private class RootAdapter extends RecyclerView.Adapter<RootAdapter.RootViewHolder> {

        private final LayoutInflater inflater;
        String[] _items = new String[]{"ITEM 1", "ITEM 2", "ITEM 3", "ITEM 4"};
        public RootAdapter(Context context)
        {
            inflater = LayoutInflater.from(context);
        }

        @Override
        public RootViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View view = inflater.inflate(R.layout.root_row, viewGroup, false);
            RootViewHolder rvi = new RootViewHolder(view);
            return rvi;
        }

        @Override
        public void onBindViewHolder(RootViewHolder rootViewHolder, int i) {
            rootViewHolder.txtRootLine.setText(_items[i]);
            rootViewHolder.recyclerViewChild.setLayoutManager(new LinearLayoutManager(inflater.getContext()));
            rootViewHolder.recyclerViewChild.setAdapter(new ChildAdapter(inflater));
        }

        @Override
        public int getItemCount() {
            return _items.length;
        }

        class RootViewHolder extends RecyclerView.ViewHolder {
            TextView txtRootLine;
            RecyclerView recyclerViewChild;
            public RootViewHolder(View itemView) {
                super(itemView);
                txtRootLine = (TextView) itemView.findViewById(R.id.txtRootLine);
                recyclerViewChild = (RecyclerView) itemView.findViewById(R.id.recyclerChild);
            }
        }
    }


private class ChildAdapter extends RecyclerView.Adapter<ChildAdapter.ChildViewHolder> {
        private LayoutInflater _inflater;
        String[] _childItems = new String[]{"child 1", "child 2", "child 2"};
        public ChildAdapter(LayoutInflater inflater) {
            _inflater = inflater;
        }

        @Override
        public ChildViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View view = _inflater.inflate(R.layout.child_row, viewGroup, false);
            ChildViewHolder rvi = new ChildViewHolder(view);
            return rvi;
        }

        @Override
        public void onBindViewHolder(ChildViewHolder childViewHolder, int i) {
            childViewHolder.txtChildLine.setText(_childItems[i]);
        }

        @Override
        public int getItemCount() {
            return _childItems.length;
        }

        public class ChildViewHolder extends RecyclerView.ViewHolder {
            TextView txtChildLine;
            public ChildViewHolder(View itemView) {
                super(itemView);
                txtChildLine = (TextView) itemView.findViewById(R.id.txtChildLine);
            }
        }
    }


activity_main.xml

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="main text"/>

    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/recyclerRoot"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.RecyclerView>

</LinearLayout>

root_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/txtRootLine"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/recyclerChild"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.RecyclerView>

</LinearLayout>


child_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/txtChildLine"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>
like image 523
cetinyasar Avatar asked Mar 05 '15 19:03

cetinyasar


People also ask

Can we have nested RecyclerView in Android?

A nested RecyclerView is an implementation of a RecyclerView within a RecyclerView. An example of such a layout can be seen in a variety of apps such as the Play store where the outer (parent) RecyclerView is of Vertical orientation whereas the inner (child) RecyclerViews are of horizontal orientations.

What is nested scrolling in RecyclerView?

NestedScrollView is just like ScrollView, but it supports acting as both a nested scrolling parent and child. In your case you have to define your own scrolling behaviour.

What is concat adapter?

ConcatAdapter is a new class available in recyclerview:1.2. 0-alpha02 which enables you to sequentially combine multiple adapters to be displayed in a single RecyclerView .

How to create RecyclerView in RecyclerView Android?

you can use LayoutInflater to inflate your dynamic data as a layout file. UPDATE : first create a LinearLayout inside your CardView's layout and assign an ID for it. after that create a layout file that you want to inflate. at last in your onBindViewHolder method in your "RAdaper" class.


1 Answers

Existing layout manager does not support wrap content yet. Test it by assigning a fixed height to your recyclerChild and the view would appear.

As a solution to this problem you can create a new LayoutManager that extends the existing one and overrides onMeasure method to measure for wrap content.

like image 84
Syed Arsalan Kazmi Avatar answered Oct 20 '22 10:10

Syed Arsalan Kazmi