【问题标题】:Search Fireabase doesn't work after i added the delete Firebase?添加删除 Firebase 后,搜索 Fireabase 不起作用?
【发布时间】:2020-06-07 19:01:33
【问题描述】:

我不知道为什么在我的 java 类中实现 searchview firebase 后删除功能停止工作。如果我删除每个功能之一(搜索或删除),其中一个功能将起作用。所以请你们帮我解决这些问题。在这个项目中,我还实现了 onitemclicklistener 作为删除数据的选择。

ImagaAdapter.Class

package com.example.lasttic;


public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {


    private Context mContext;
    private ArrayList<DatabaseImage> mUploads;
    private ArrayList<DatabaseImage> arraylistFiltered;


    private OnItemCLickListener mListener;

    public ImageAdapter(Context context,ArrayList<DatabaseImage> uploads)
    {

        mContext = context;
        mUploads = uploads;
        arraylistFiltered = new ArrayList<> (mUploads);

    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(mContext).inflate(R.layout.image_item,parent,false);

        ImageViewHolder viewHolder = new ImageViewHolder(v);

        return viewHolder;
    }

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

        final DatabaseImage uploadCur = mUploads.get(position);
        holder.imageName.setText(uploadCur.getImgName());
        Picasso.get().load(uploadCur.getImgUrl())
                     .placeholder(R.drawable.imagepreview)
                     .fit()
                     .centerCrop()
                     .into(holder.imageUpload);

        holder.Detailkk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext,TicketDetail.class);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                {
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }

                mContext.startActivity(intent);
            }
        });


       /* holder.imageUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext,ViewTicketImage.class);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                {

                    intent.putExtra("img_url", uploadCur.getImgUrl());
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }
                mContext.startActivity(intent);
            }
        }); */



    }


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




    public Filter getFilter()
    {
        return exampleFilter;
    }

    private Filter exampleFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<DatabaseImage> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(arraylistFiltered);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (DatabaseImage item : arraylistFiltered) {
                    if (item.getImgName().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults results) {
            mUploads.clear();
            mUploads.addAll((List)results.values);
            notifyDataSetChanged();
        }
    };

    public class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener
    {

        public TextView imageName;
        public ImageView imageUpload;
        public Button Detailkk;


        public ImageViewHolder(@NonNull View itemView) {
            super(itemView);
            imageName = itemView.findViewById(R.id.imageName);
            imageUpload = itemView.findViewById(R.id.imageUpload);
            Detailkk = itemView.findViewById(R.id.detail22);
            itemView.setOnClickListener(this);
            itemView.setOnCreateContextMenuListener(this);

        }

        @Override
        public void onClick (View v)
        {
            if (mListener != null)
            {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION)
                {
                    mListener.onitemClick(position);
                }
            }
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            menu.setHeaderTitle("Select Action");
            MenuItem delete = menu.add(Menu.NONE,1,1,"Delete");
            MenuItem click = menu.add(Menu.NONE,2,2,"ViewImage");
            delete.setOnMenuItemClickListener(this);

        }

        @Override
        public boolean onMenuItemClick(MenuItem item) {
            if (mListener != null)
            {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION)
                {
                    switch (item.getItemId())
                    {
                        case 1:
                            mListener.onDeleteClick(position);
                            return true;
                        case 2:
                             mListener.onitemClick(position);
                             return true;

                    }

                }
            }
            return false;
        }
    }

    public long getItemId(int position)
    {
        return position;
    }


    public interface OnItemCLickListener
    {
        void onitemClick (int position);

            void onDeleteClick (int position);
    }

    public void setOnItemClickListener (OnItemCLickListener listener)
    {
        mListener = listener;
    }

}

viewImageUploadClass

 public class viewImageUpload extends AppCompatActivity implements ImageAdapter.OnItemCLickListener{

    private RecyclerView mRecyleView;
    private ImageAdapter mAdapter;
    private ArrayList<DatabaseImage> mUploads;
    private FirebaseStorage mStorage;
    private SearchView mSsearch;
    private ProgressBar progressBar;

    private ValueEventListener mDBListener;
    private DatabaseReference mDatabaseReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_image_upload);

        mRecyleView = findViewById(R.id.recycleviewimage);
        mRecyleView.setHasFixedSize(true);
        mRecyleView.setLayoutManager(new LinearLayoutManager(this));

        progressBar = (ProgressBar) findViewById(R.id.progress_circular);
        mUploads = new ArrayList<>();

        mAdapter = new ImageAdapter(viewImageUpload.this, mUploads);
        mRecyleView.setAdapter(mAdapter);

        mAdapter.setOnItemClickListener(viewImageUpload.this);

        mStorage = FirebaseStorage.getInstance();

        mDatabaseReference = FirebaseDatabase.getInstance().getReference("uploads");
        mDBListener = mDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mUploads.clear();

                for (DataSnapshot postSnapShot : dataSnapshot.getChildren()) {
                    DatabaseImage upload = postSnapShot.getValue(DatabaseImage.class);
                    upload.setkeys(postSnapShot.getKey());
                    mUploads.add(upload);
                }
                mAdapter = new ImageAdapter(getBaseContext(),mUploads);
                mRecyleView.setAdapter(mAdapter);
                mAdapter.notifyDataSetChanged();
                progressBar.setVisibility(View.INVISIBLE);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(viewImageUpload.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
                progressBar.setVisibility(View.INVISIBLE);

            }
        });

        mSsearch = (SearchView)findViewById(R.id.mSearch);
        mSsearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if(mAdapter!=null){
                    mAdapter.getFilter().filter(newText);
                }
                return false;
            }
        });

    }

    @Override
    public void onitemClick(int position) {
      Toast.makeText(this,"Hello",Toast.LENGTH_SHORT).show();
    }


    @Override
    public void onDeleteClick(int position) {
        DatabaseImage selectedItem = mUploads.get(position);
        final String selectedKey = selectedItem.getkeys();

        StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getImgUrl());
        imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                mDatabaseReference.child(selectedKey).removeValue();
                Toast.makeText(viewImageUpload.this,"Delete Successfully",Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mDatabaseReference.removeEventListener(mDBListener);
    }

}

【问题讨论】:

    标签: android firebase-realtime-database android-recyclerview searchview onitemclicklistener


    【解决方案1】:

    要删除文档,请使用 delete() 方法:

     db.collection("cities").doc("DC").delete().then(function() {
     console.log("Document successfully deleted!");
     }).catch(function(error) {
     console.error("Error removing document: ", error);
     });
    

    删除字段:

    要从文档中删除特定字段,请在更新文档时使用 FieldValue.delete() 方法:

    var cityRef = db.collection('cities').doc('BJ');
    
    // Remove the 'capital' field from the document
    var removeCapital = cityRef.update({
    capital: firebase.firestore.FieldValue.delete()
    });
    

    使用 Firebase CLI 删除数据 您还可以使用 Firebase CLI 删除文档和集合。使用以下命令删除数据:

    firebase firestore:delete [options] <<path>>
    

    【讨论】:

      【解决方案2】:

      当您实现搜索时,ImageAdapter 内的 mUploads 在搜索期间更改,但在 viewImageUpload 活动中没有更改。因此它得到错误的数据并删除错误的图像和它的数据库参考。要克服这个问题,您必须更改您的OnItemCLickListener 并将DatabaseImage 传递给position。检查以下:

      public interface OnItemCLickListener {
          void onitemClick (DatabaseImage selectedItem, int position);
      
          void onDeleteClick (DatabaseImage selectedItem, int position);
      }
      

      并通过DatabaseImage 来处理它,如下所示:

      mListener.onDeleteClick(mUploads.get(position), position);
      

      然后使用这个DatabaseImage 而不是你的Activity。

      @Override
      public void onDeleteClick(DatabaseImage selectedItem, int position) {
          final String selectedKey = selectedItem.getkeys();
      
          StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getImgUrl());
          imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
              @Override
              public void onSuccess(Void aVoid) {
                  mDatabaseReference.child(selectedKey).removeValue();
                  Toast.makeText(viewImageUpload.this,"Delete Successfully",Toast.LENGTH_SHORT).show();
              }
          });
      }
      

      【讨论】:

      • @ThanaKim,检查我的答案,让我知道更新。谢谢
      • @ThanaKim,你检查了吗?
      • Asaduzzaman,我试过用你的方法,但删除功能仍然不起作用,只有搜索recyclerview先生。
      • 我刚刚更新了 viewImageUpload.java 中的代码 ' mAdapter = new ImageAdapter(getBaseContext(),mUploads); mRecyleView.setAdapter(mAdapter);'。一旦我添加了这个,搜索功能就可以工作,但删除功能不起作用。一旦我删除它 ImageAdapter(getBaseContext(),mUploads); mRecyleView.setAdapter(mAdapter)' 删除功能有效,搜索功能无效
      • 你没有按照我的解决方案。首先按照我的解决方案,然后让我知道。谢谢
      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 2014-10-22
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多