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)
When I click "X" button then that item is removing but recyclerview height is not change.
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>
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.
I found the solution. :D swapAdapter is the answer (Thanks to IDE)
ingList.swapAdapter(ingredientsAddAdapter,true);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With