【问题标题】:RecyclerView won't update after deleting file删除文件后 RecyclerView 不会更新
【发布时间】:2022-01-19 01:01:00
【问题描述】:

我在 RecyclerView 中有 CardViews,每个都有一个删除按钮,单击它会从数据库中删除数据,从该位置的 ArrayList 中删除项目并运行动画。 当删除它消失并创建它自己的副本时,Toast 显示 ArrayList 是空的/没有该项目,但它仍然存在我可以单击它和所有内容,只有在刷新片段后(更改为底部导航选项卡中的另一个片段或单击在同一个上)它消失了。

这是我的适配器:


public class KitAdapter extends RecyclerView.Adapter<KitAdapter.MyViewHolder> {

    Context context;
    ArrayList<Kit> kitList;
    OnKitClickListener clickListener;
    FirebaseFirestore db;
    FirebaseAuth mAuth;
    FirebaseStorage FS;
    String userID, saveShare;
    ArrayList<String> DRList;


    public KitAdapter(Context context, ArrayList<Kit> kitList, OnKitClickListener clickListener, String saveShare, ArrayList<String> DRList) {
        this.context = context;
        this.kitList = kitList;
        this.clickListener = clickListener;
        this.saveShare = saveShare;
        this.DRList = DRList;

    }

    public ArrayList<Kit> getKitList() {
        return kitList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.kitview, parent, false);
        return new MyViewHolder(v, clickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        Kit kit = kitList.get(position);

        db = FirebaseFirestore.getInstance();
        mAuth = FirebaseAuth.getInstance();
        FS = FirebaseStorage.getInstance();

        this.userID = kit.getUserID();
        holder.Name.setText(kit.getName());
        holder.kcal.setText(kit.getKcalM() / kit.getSavedDays() + "kcal");
        holder.prot.setText(kit.getProtM() / kit.getSavedDays() + "g");
        holder.uh.setText(kit.getUhM() / kit.getSavedDays() + "g");
        holder.mast.setText(kit.getMastM() / kit.getSavedDays() + "g");
        holder.numOfDays.setText("Broj dana " + kit.getSavedDays() + "");
        holder.NameS = kit.getName();
        holder.kcalS = String.valueOf(kit.getKcalM());
        holder.protS = String.valueOf(kit.getProtM());
        holder.uhS = String.valueOf(kit.getUhM());
        holder.mastS = String.valueOf(kit.getMastM());
        holder.dayNums = kit.getSavedDays();
        holder.DRlist = this.DRList;
        holder.userID = this.userID;


        if(saveShare.equals("Saved")){
            if(kit.getShared().equals("No")) {
                holder.saveShare.setImageResource(R.drawable.ic_upload_black_24dp);
                holder.saveShare.setTag(R.drawable.ic_upload_black_24dp);
            }else{
                holder.saveShare.setImageResource(R.drawable.ic_file_download_done_black_24dp);
                holder.saveShare.setTag(R.drawable.ic_file_download_done_black_24dp);
            }

            if(!userID.equals(mAuth.getCurrentUser().getUid())){
                holder.saveShare.setVisibility(View.GONE);
            }
        }else if(saveShare.equals("Search")){
            holder.saveShare.setImageResource(R.drawable.ic_file_download_black_24dp);
            holder.saveShare.setTag(R.drawable.ic_file_download_black_24dp);
            holder.delete.setVisibility(View.GONE);

            if(DRList.contains(holder.NameS)){
                holder.saveShare.setImageResource(R.drawable.ic_file_download_done_black_24dp);
                holder.saveShare.setTag(R.drawable.ic_file_download_done_black_24dp);
            }

        }





        db.collection("Users Data")
                .document(this.userID)
                .get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        User user = task.getResult().toObject(User.class);
                        String userName = user.getUsername();
                        holder.userName.setText(userName);
                    }
                });

        FS.getReference().child(this.userID + ".jpg")
                .getDownloadUrl()
                .addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(@NonNull Uri uri) {
                        Picasso.get().load(uri).into(holder.pfp);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        holder.pfp.setImageResource(R.drawable.ic_person_black_24dp);
                    }
                });



    }

    @Override
    public int getItemCount() {
        return kitList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView Name, numOfDays, kcal, prot, uh, mast, userName;
        ImageView saveShare, delete;
        String NameS, kcalS, protS, uhS, mastS, userID;
        int dayNums;
        OnKitClickListener onKitListener;
        CircleImageView pfp;
        ArrayList<String> DRlist;



        public MyViewHolder(@NonNull View itemView, OnKitClickListener onKitListener) {
            super(itemView);

            Name = itemView.findViewById(R.id.kitName);
            numOfDays = itemView.findViewById(R.id.dayNum);
            kcal = itemView.findViewById(R.id.kcal);
            prot = itemView.findViewById(R.id.prot);
            uh = itemView.findViewById(R.id.uh);
            mast = itemView.findViewById(R.id.mast);
            userName = itemView.findViewById(R.id.userName);
            pfp = itemView.findViewById(R.id.pfp);
            saveShare = itemView.findViewById(R.id.saveShare);
            delete = itemView.findViewById(R.id.delete);
            this.onKitListener = onKitListener;
            itemView.setOnClickListener(this);

            saveShare.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onKitListener.onKitAdd(getAdapterPosition(), saveShare, Name.getText().toString());
                }

            });
            delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onKitListener.onKitDelete(getAdapterPosition(), (CardView) itemView, userID);
                }
            });
        }

        @Override
        public void onClick(View v) {
            onKitListener.onKitClick(getAdapterPosition(), NameS, kcalS, protS, uhS, mastS, dayNums);

        }

    }
    public interface OnKitClickListener{
        void onKitClick(int position, String NameS, String kcalS, String protS, String uhS, String mastS, int dayNums);
        void onKitAdd(int position, ImageView addShare, String NameS);
        void onKitDelete(int position, CardView card, String userID);
    }
}

这是片段中删除项目的部分代码:


    @Override
    public void onKitDelete(int position, CardView card, String userID) {
        Handler handler = new Handler();

        if(userID.equals(mAuth.getCurrentUser().getUid())) {
            db.collection("Users Data")
                    .document(userID)
                    .collection("Kits")
                    .whereEqualTo("name", kitlist.get(position).getName())
                    .get()
                    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if (!task.isSuccessful()) {
                                return;
                            }

                            task.getResult().getDocuments().get(0).getReference()
                                    .delete();

                        }
                    });
        }else{
            db.collection("Users Data")
                    .document(mAuth.getCurrentUser().getUid())
                    .collection("Saved Kits")
                    .document(kitlist.get(position).getName())
                    .delete();


        }


        Toast.makeText(getContext(),  kitlist.toString(), Toast.LENGTH_SHORT).show();


        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Animation anim = AnimationUtils.loadAnimation(getContext(), R.anim.zoomout);
                card.startAnimation(anim);
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if(kitlist.isEmpty()){
                            emptTxt.setVisibility(View.VISIBLE);

                            kitlist.remove(position);
                            rec.removeViewAt(position);
                            adapter.notifyItemRemoved(position);
                        }
                    }
                },300);

            }
        }, 150);

    }

我尝试了这些组合:

          kitlist.remove(position);
          rec.removeViewAt(position);
          adapter.notifyItemRemoved(position);
//This one you can see in code above
          kitlist.remove(position);
          adapter.notifyDataSetChange(position)

并尝试将 onKitDelete 设为默认值并使用 notfiy()/notifyAll()

public interface OnKitClickListener{
        void onKitClick(int position, String NameS, String kcalS, String protS, String uhS, String mastS, int dayNums);
        void onKitAdd(int position, ImageView addShare, String NameS);
        default void onKitDelete(int position, CardView card, String userID){
            notify();
        }
    }

我总是得到相同的结果。

【问题讨论】:

    标签: android android-recyclerview android-adapter


    【解决方案1】:

    很容易更新您的回收站视图 android ViewModel 架构Android ViewModel Docs

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    • 我想知道为什么我的代码不能正常工作以及如何修复它,你能帮我解决这个问题吗,因为这根本没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    相关资源
    最近更新 更多