问题描述
我将 MVVM Architecture
与 LiveData
一起使用,我的问题是在删除元素后刷新 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 (将#修改为@)