RecyclerView does not fully expand to show all elements
Asked Answered
O

2

14

I've created an EditText, a Button and a RecyclerView (composed of 1 TextView and 1 ImageView children) to add TextViews that looks like this . In the EditText at the top, users may enter text and hit the + button. This adds their text to a List(String) which is used to update the RecyclerView. The user may hit the x at the right to delete an entry from the RecyclerView. Here is an image of the overall fragment layout

The issue, which you can see in the image, is that after a few submissions, the RecyclerView stops expanding and remains at a fixed size (notice the small blip in the bottom right). You may scroll in the RecyclerView to view the items, items are still added to it, but it will not expand to the full size (the one in the image has 20+ items). If I delete an item, the height grows for some reason but it still won't display all elements and it shrinks back when I add a new item.

Things I've tried

Here is the RecyclerView code. The heirarchy goes

<LinearLayout>
   <ScrollView>
      <LinearLayout>
         <RecyclerView />
      </LinearLayout>
   </ScrollView>
</LinearLayout>

All heights and widths are set to match parent, all orientations to vertical:

<android.support.v7.widget.RecyclerView
            android:id="@+id/ingredientsRecyclerView"
            android:layout_marginTop="4dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipChildren="false"
            android:clipToPadding="false"
            >

The code to add an entry to the RecyclerView (outside of the adapter):

ingredientsButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (ingredientsText.getText().toString().length() > 0) {
                mIngredients.add(ingredientsText.getText().toString());
                ingredientsText.setText("");
                mAdapter.notifyDataSetChanged();
                mRecyclerView.setBackgroundResource(R.drawable.rounded_edittext);
            }
        }
    });

And, finally, the code to delete an entry from the RecyclerView (inside the RV adapter):

cancelImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                        mIngredients.remove(getAdapterPosition());
                mAdapter.notifyItemRemoved(getAdapterPosition());
                mAdapter.notifyItemRangeChanged(getAdapterPosition(), mIngredients.size());
                if(mAdapter.getItemCount() == 0)
                mRecyclerView.setBackgroundResource(0);
            }
        });

Any assistance would be GREATLY appreciated, as I can't figure this out for the life of me!

Overactive answered 22/9, 2016 at 1:51 Comment(0)
G
56

use NestedScrollView instead of ScrollView and setNestedScrollEnabled(false) on the RecyclerView

Genipap answered 22/9, 2016 at 2:5 Comment(2)
Lightning fast response and exactly right! Thanks for the help mate!Overactive
This answer deserves a bounty!Nepil
R
2

k0sh is absolutely right. Just to add, use the full class name, which is android.support.v4.widget.NestedScrollView (make sure you have the v4 support library in your build.gradle file), or Android won't find NestedScrollView class. Source: Error inflating class - NestedScrollView - class not found

Rorry answered 8/11, 2017 at 21:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.