RecyclerView list didn't refresh after delete an element

590 Views Asked by At

I am using MVVM Architecture with LiveData and my problem is with refreshing RecyclerView list after delete an element. When I use SearchView and then delete some item, it is still on List visible to the user.
For example, I have 10 items and use searchView, put some text and I have 4 items, then I haven't clear searchView yet but try to delete an item. It has been deleted from Database corectly, but RecyclerView list still shows this item. The same thing is with OnSwipe method. One thing that works is to change method in adapter class from:

   public void copylist(List<Item_get> item_gets) {
        if (data_list2 != null) {
            data_list2.clear();
        } else {
            data_list2 = new ArrayList<>();
        }
        data_list2.addAll(item_gets);
        if (data_list2_full != null) {
            data_list2_full.clear();
            data_list2_full.addAll(data_list2);
        } else {
            data_list2_full = new ArrayList<>(data_list2);
        }
    }

TO:

  public void copylist2(List<Item_get> item_gets) {
        data_list2 = new ArrayList<>();
        data_list2.addAll(item_gets);
        data_list2_full = new ArrayList<>();
        data_list2_full.addAll(data_list2);
        notifyDataSetChanged();
        }
    

But it is a very "costly" operation, always notify all elements.
I will only add, when I don't use SearchView everything works good. Items react to the changes.
My Fragment Class:

 
public class Main_Database_fragment extends Fragment implements Dialog_Amount.Dialog_AmountListener {
 private View rootView;
 private RecyclerView recyclerView;
 private Recycler_Adapter mAdapter;
 private RecyclerView.LayoutManager mLayoutManager;
 private Item_get_VIEWMODEL item_get_viewmodel;
 private ActivityResultLauncher<Intent> start_next_activity;
 private Item_get item_get;
 private int position;
 private TextView textRecycler;
 ItemTouchHelper itemTouchHelper;
    public static Main_Database_fragment newInstance(String param1, String param2) {
        Main_Database_fragment fragment = new Main_Database_fragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }

        }

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_main__database_fragment,container,false);
        return rootView;
    }


    @Override
    public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
        build_RecyclerView();
        actionButtons();
        //Init View Model
        item_get_viewmodel = new ViewModelProvider(this).get(Item_get_VIEWMODEL.class);
        item_get_viewmodel.getAll_ItemsModel().observe(getViewLifecycleOwner(), new Observer<List<Item_get>>() {
            @Override
            public void onChanged(List<Item_get> item_gets) {
                mAdapter.submitList(item_gets);
                mAdapter.copylist(item_gets);
                if(item_gets.isEmpty()){
                    textRecycler.setVisibility(View.VISIBLE);
                    recyclerView.setVisibility(View.GONE);
                }else {
                    textRecycler.setVisibility(View.GONE);
                    recyclerView.setVisibility(View.VISIBLE);
                }
            }
        });
        super.onViewCreated(view, savedInstanceState);
    }
    public void build_RecyclerView(){
        textRecycler = rootView.findViewById(R.id.recycler_empty_main_data);
        recyclerView = rootView.findViewById(R.id.recycler_edit_del_product);
        recyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        mAdapter = new Recycler_Adapter();
        recyclerView.setAdapter(mAdapter);
    }
    public void actionButtons(){
        mAdapter.setOnItemClickListener(new Recycler_Adapters_items() {

            @Override
            public void onEditClick(Item_get item_get) {
                Intent intent = new Intent(getActivity(), Edit_Delete_details.class);
                intent.putExtra(Edit_Delete_details.EXTRA_ID, item_get.getId());
                intent.putExtra(Edit_Delete_details.MAIN,1);
                startActivity(intent);
            }

            @Override
            public void onDeleteClick(Item_get item_get) {
                item_get_viewmodel.delete(item_get);
            }

            @Override
            public void onItemClick(Item_get item_get,int position) {
                Intent intent = new Intent(getActivity(), Product_specific_detail.class);
                intent.putExtra(Product_specific_detail.EXTRA_ID_2, item_get.getId());
                startActivity(intent);
            }
        });

        itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                position = viewHolder.getAbsoluteAdapterPosition();
                openDialog();
                item_get2 = mAdapter.getItemAt(viewHolder.getAbsoluteAdapterPosition());
            }
        });
        itemTouchHelper.attachToRecyclerView(recyclerView);
    }

   
    //Here we pass String text from searchview to adapter;
    public void check(String newText){
        mAdapter.getFilter().filter(newText);
  
    public void openDialog(){
        Dialog_Amount dialog_amount = new Dialog_Amount();
        dialog_amount.setCancelable(false);
        dialog_amount.show(getChildFragmentManager(),null);
    }
// In Short: Here user determine to delete item after swipe it to right. If "Yes" then item is removed from RecyclerView List.
@Override
    public void applyText(int text) {
        if(text != -1){
            item_get2.setNameProduct(item_get2.getname_product());
            item_get2.setDate_buy(null);
            item_get2.setAmount(0);
            item_get_viewmodel.update(item_get2);
            mAdapter.notifyItemRemoved(position);
        } else {
            mAdapter.notifyItemChanged(position);
        }
    }
}

MyAdapter:


public class Recycler_Adapter extends ListAdapter<Item_get,Recycler_Adapter.recyclerViewHolder> implements Filterable {

    public Recycler_Adapters_items clickListener;
    private List<Item_get> data_list2;
    private List<Item_get> data_list2_full;
    public Recycler_Adapter() {
        super(DIFF_CALLBACK);
    }

    private static final DiffUtil.ItemCallback<Item_get> DIFF_CALLBACK = new DiffUtil.ItemCallback<Item_get>() {
        @Override
        public boolean areItemsTheSame(@NonNull Item_get oldItem, @NonNull Item_get newItem) {
            return oldItem.getId() == newItem.getId();
        }

        @Override
        public boolean areContentsTheSame(@NonNull Item_get oldItem, @NonNull Item_get newItem) {
            return oldItem.getname_product().equals(newItem.getname_product()) && oldItem.getAmount() == newItem.getAmount()
                    && oldItem.food_type.getCode() == newItem.food_type.getCode() && oldItem.package_type.getCode() == newItem.package_type.getCode();
        }
    };
    public void copylist(List<Item_get> item_gets) {
        if (data_list2 != null) {
            data_list2.clear();
        } else {
            data_list2 = new ArrayList<>();
        }
        data_list2.addAll(item_gets);
        if (data_list2_full != null) {
            data_list2_full.clear();
            data_list2_full.addAll(data_list2);
        } else {
            data_list2_full = new ArrayList<>(data_list2);
        }
    }

    public void setOnItemClickListener(Recycler_Adapters_items mClickListener) {
        clickListener = mClickListener;
    }


   public  class recyclerViewHolder extends RecyclerView.ViewHolder {
        public ImageView mImageView1;
        public ImageView mImageView2;
        public ImageView mImageView3;
        public TextView mTextView1;
        public TextView mTextView2;
        public TextView mTextView3;
        public TextView mTextView4;

       public recyclerViewHolder(final View itemView, final Recycler_Adapters_items listener) {
            super(itemView);
            mImageView1 = itemView.findViewById(R.id.rec_image);
            mImageView2 = itemView.findViewById(R.id.rec_image_edit);
            mImageView3 = itemView.findViewById(R.id.rec_image_del);
            mTextView1 = itemView.findViewById(R.id.rec_text_1);
            mTextView2 = itemView.findViewById(R.id.rec_text_2);
            mTextView3 = itemView.findViewById(R.id.rec_text_3);
            mTextView4 = itemView.findViewById(R.id.rect_text_4);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAbsoluteAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemClick(getItem(position), getAbsoluteAdapterPosition());
                        }
                    }
                }
            });
            mImageView2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAbsoluteAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onEditClick(getItem(position));
                        }
                    }
                }
            });
            mImageView3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAbsoluteAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onDeleteClick(getItem(position));
                        }
                    }
                }
            });
       }
    }


    @NonNull
    @Override
    public recyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_template, parent, false);
        return new recyclerViewHolder(v,clickListener);

    }

    @Override
    public void onBindViewHolder(@NonNull recyclerViewHolder holder, int position) {
        Item_get currentItem = getItem(position);
        currentItem.setId(currentItem.getId());
        holder.mTextView1.setText(currentItem.getname_product());
        holder.mTextView2.setText(R.string.choice7_cat_eating);
        holder.mImageView1.setImageResource(R.drawable.other);
        String amount = String.valueOf(currentItem.getAmount());
        holder.mTextView3.setText(amount);
        holder.mTextView4.setText(R.string.product_amount);
    }

    public Item_get getItemAt(int position){
        return getItem(position);
    }

    @Override
    public void onCurrentListChanged(@NonNull List<Item_get> previousList, @NonNull List<Item_get> currentList) {
        super.onCurrentListChanged(previousList, currentList);
    }
  @Override
    public Filter getFilter() {
      return Filter_text;
    }

    private final Filter Filter_text = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Item_get> filtered_list = new ArrayList<>();
            if (constraint == null || constraint.length() == 0) {
                filtered_list.addAll(data_list2_full);

            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();
                for (Item_get item : data_list2_full) {
                    if (item.getname_product().toLowerCase().contains(filterPattern)) {
                        filtered_list.add(item);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filtered_list;
            lastFilter = constraint.toString();
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            data_list2.clear();
            data_list2.addAll((Collection<? extends Item_get>) results.values);
            submitList(data_list2);
            notifyDataSetChanged();
        }
    };
}

ViewModel:

public class Item_get_VIEWMODEL extends AndroidViewModel {
    private final Item_get_REPOSITORY item_get_repository;
    private final LiveData<List<Item_get>> all_ItemsModel;
    public Item_get_VIEWMODEL(@NonNull Application application) {
        super(application);
        item_get_repository = new Item_get_REPOSITORY(application);
        all_ItemsModel = item_get_repository.getAll_ItemsRepo();
    }

    public void update(Item_get item_get){
        item_get_repository.update(item_get);
    }
    public void delete(Item_get item_get){
        item_get_repository.delete(item_get);
    }

    public LiveData<List<Item_get>> getAll_ItemsModel(){
        return all_ItemsModel;
    }
}

Repository:

public class Item_get_REPOSITORY{
    private final Item_get_DAO item_get_dao;
    private final LiveData<List<Item_get>> all_Items;
    public Item_get_REPOSITORY(Application application){
        Item_get_DATABASE database = Item_get_DATABASE.getInstance(application);
        item_get_dao = database.item_get_dao();
        all_Items = item_get_dao.getAllItems();
    }
    public void update(Item_get item_get){
        new Background_actions_Repo(item_get_dao,2).execute(item_get);
    }
    public void delete(Item_get item_get){
        new Background_actions_Repo(item_get_dao,3).execute(item_get);
    }
    public LiveData<List<Item_get>> getAll_ItemsRepo(){
        return all_Items;
    }
}

ItemGetDao:


@Dao
public interface Item_get_DAO {
    @Insert
    long insert(Item_get item_get);
    @Update
    void update(Item_get item_get);
    @Update
    int update2(Item_get item_get);
    @Delete
    void delete(Item_get item_get);
    @Query("SELECT ID, NAME_PRODUCT, AMOUNT, FOOD_TYPE, PACKAGE_TYPE FROM Tabela_Baza WHERE to_shop = 0 OR to_shop is null   ORDER BY actual_date DESC ")
    LiveData<List<Item_get>> getAllItems();
}

How to fix it?

0

There are 0 best solutions below