Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recyclerview height is not changing after removing item

I need help. I'm working on a Android app. I use recyclerview. My layout looks like after adding item.

p.s (Ekle: Add / İçindekiler: ingredients / Tarif Başlığı: Recipe Title)

After adding items When I click "X" button then that item is removing but recyclerview height is not change.

enter image description here enter image description here

How can I handle it? Thanks in advance

adapter:

public class IngredientsAddAdapter extends RecyclerView.Adapter<IngredientsAddAdapter.IngredientsVH> {

    List<String> dataList;
    Context context;
    OnItemClickListener clickListener;

    public IngredientsAddAdapter(Context context, List<String> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    @Override
    public IngredientsVH onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ingredients_add_list_item, viewGroup, false);
        return new IngredientsVH(view);
    }

    @Override
    public void onBindViewHolder(IngredientsVH ingredientsVH, int i) {
        ingredientsVH.title.setText(dataList.get(i));

    }

    @Override
    public int getItemCount() {
        return dataList == null ? 0 : dataList.size();
    }

    class IngredientsVH extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView title;
        ImageButton deleteIng;

        public IngredientsVH(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.ingredientItem);
            deleteIng = (ImageButton) itemView.findViewById(R.id.deleteIng);
            deleteIng.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            clickListener.onItemClick(v, getAdapterPosition());
            dataList.remove(getAdapterPosition());
            notifyItemRemoved(getAdapterPosition());
            notifyItemRangeChanged(getAdapterPosition(), dataList.size());
        }

    }

    public interface OnItemClickListener {
        public void onItemClick(View view, int position);
    }

    public void SetOnItemClickListener(final OnItemClickListener itemClickListener) {
        this.clickListener = itemClickListener;
    }

}

Activity:

ingList = (RecyclerView) findViewById(R.id.ingList);
ingList.setNestedScrollingEnabled(false);
ingList.setLayoutManager(new LinearLayoutManager(recipeAdd.this));
ingList.setItemAnimator(new DefaultItemAnimator());
ingList.setHasFixedSize(true);
if (ingredientsAddAdapter == null) {
    ingredientsAddAdapter = new IngredientsAddAdapter(recipeAdd.this, ingredientsAddArray);
    ingList.setAdapter(ingredientsAddAdapter);
    ingredientsAddAdapter.SetOnItemClickListener(new IngredientsAddAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
        }
    });
}

recipe_add.xml (These codes are for testing purposes only. :D )

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:background="@color/colorBg"
    android:padding="5dp">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">


        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginBottom="10dp">

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:id="@+id/recipeTitle"
                    android:inputType="text"
                    android:hint="Tarif Başlığı"
                    style="@style/Widget.AppCompat.Light.AutoCompleteTextView"
                    android:fontFamily="sans-serif"
                    android:textSize="14sp"
                    android:textStyle="normal|bold"
                    android:layout_margin="5dp"
                    android:background="@drawable/border"
                    android:padding="10dp" />

            </LinearLayout>
        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <Button
                    android:text="Ekle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentEnd="true"
                    android:id="@+id/ingAdd"
                    android:onClick="addIng" />

                <TextView
                    android:text="İçindekiler"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/textView4"
                    android:textStyle="normal|bold"
                    android:textSize="14sp"
                    android:padding="10dp"
                    android:layout_centerVertical="true"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true" />
            </RelativeLayout>

        </android.support.v7.widget.CardView>

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/ingList" />
        </android.support.v7.widget.CardView>

    </LinearLayout>

</RelativeLayout>

ingredients_add_list_item.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="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@drawable/border_top"
    android:orientation="horizontal">

    <ImageButton
        android:layout_width="30dp"
        android:layout_height="match_parent"
        android:src="@drawable/crop__ic_cancel"
        android:id="@+id/deleteIng"
        android:background="@android:color/transparent" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ingredientItem"
        android:text="Hello world"
        android:textSize="16dp"
        android:textColor="@color/colorDark"
        android:textStyle="bold"
        android:padding="8dp" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/isClick"
        android:text="false"
        android:textSize="16dp"
        android:visibility="gone"/>
</LinearLayout>
like image 698
Talut TASGIRAN Avatar asked Dec 04 '16 19:12

Talut TASGIRAN


2 Answers

I was facing the exact same issue and the thing that worked for me was

recyclerView.setHasFixedSize(false);

setHasFixedSize tells the RecyclerView that whether its size is dependent on the adapter content. Setting it to false is really expensive, since there will be frequent insertions and deletions in RecyclerView. But in my case it was necessary.

like image 82
Meeran Tariq Avatar answered Oct 31 '22 11:10

Meeran Tariq


I found the solution. :D swapAdapter is the answer (Thanks to IDE)

ingList.swapAdapter(ingredientsAddAdapter,true);

like image 42
Talut TASGIRAN Avatar answered Oct 31 '22 11:10

Talut TASGIRAN