删除元素后 RecyclerView 列表未刷新

问题描述

我将 MVVM ArchitectureLiveData 一起使用,我的问题是在删除元素后刷新 RecyclerView 列表。当我使用 SearchView 然后删除某个项目时,它仍然在 List 中对用户可见。
例如,我有 10 个项目并使用 searchView,输入一些文本,我有 4 个项目,然后我还没有清除 searchView,但尝试删除一个项目。已正确从数据库删除,但 RecyclerView 列表仍显示此项。 OnSwipe 方法也是如此。 有效的一件事是更改适配器类中的方法

   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 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();
        }
    

但这是一个非常“昂贵”的操作,总是通知所有元素。
我只会补充一点,当我不使用 SearchView 时,一切都很好。项目对更改做出反应。
我的片段类:

 
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);
        }
    }
}

我的适配器:


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();
        }
    };
}

视图模型:

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;
    }
}

存储库:

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();
}

如何解决

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)