我使用Firebase資料庫和存盤向回收器視圖檢索專案記錄,并實作了public void onDeleteClick(int position)以洗掉所選專案。并添加了一個自定義警報框來確認洗掉。在沒有警報對話框的情況下,當我點擊洗掉時,它是相當有效的。但是當我從對話框中選擇 "No "時,它就不能再被洗掉了,并顯示了以下錯誤。
你能幫助我解決這個問題嗎?
E/StorageException: StorageException has occurred.
物件不存在的位置。
代碼。-13010 HttpResult: 404"error"/span>: { "code"/span>: 404, " message": "未找到。 無法洗掉物件", "狀態": "DELETE_OBJECT" }}}。
java.io.IOException: { "錯誤": { "代碼": 404, " message": "未找到。 無法洗掉物件", "狀態": "DELETE_OBJECT" }}}。
at com.google.firebase.storage. 網路.NetworkRequest.parseResponse(NetworkRequest.java:445)
at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:462)。
at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:453)
at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:272)
下面是代碼
public void onDeleteClick(int position) {
Upload selectedItem = mUploads.get(position)。
StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getmImageUrl())。
imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void>(){
public void onSuccess(Void aVoid) {
View view = LayoutInflater。 from(ShowPatientsRecords.this).inflate(R.layout.alertdelete, null)。
Button no = view.findViewById(R.id.dltNo)。
Button yes = view.findViewById(R.id.dltYes);
AlertDialog dialog = new AlertDialog. Builder(ShowPatientsRecords.this).setView(view).create()。
dialog.setCancelable(false)。
dialog.show()。
yes.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Upload selectedItem = mUploads.get(position)。
final String selectedKey = selectedItem.getmKey()。
mDatabaseRef.child(selectedKey).removeValue(); **//這一行在警報對話框中沒有點擊后不起作用**。
dialog.dismiss()。
Toast.makeText(ShowPatientsRecords.this, "Record deleted", Toast.LENGTH_LONG).show()。
}
});
no.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss()。
}
});
}
});
}
配接器類
@Override
public int getItemCount() {
return mUploads.size()。
}
public class ImageViewHolder extends RecyclerView. ViewHolder implements View.OnClickListener,
View.OnCreateContextMenuListener,
MenuItem.OnMenuItemClickListener{
public TextView recDate;
public TextView recDes;
public TextView recDoc;
public ImageView imageView;
public ImageViewHolder(@NonNull View itemView) {
super(itemView)。
recDate = itemView.findViewById(R.id.showdate);
recDes = itemView.findViewById(R.id.showdescription);
recDoc = itemView.findViewById(R.id.showdoc);
imageView = itemView.findViewById(R.id.showImage);
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) /span> {
menu.setHeaderTitle("選擇行動")。
MenuItem delete = menu. add(Menu.NONE, 1, 1, "delete")。
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;
}
}
}
return false;
}
}
public interface OnItemClickListener {
void onItemClick(int position)。
void onDeleteClick(int position)。
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener。
}
uj5u.com熱心網友回復:
問題是,你在顯示要求用戶確認的警報框之前,就已經從Firebase存盤中洗掉了檔案。流程是:
onDeleteClick找到圖片URL的檔案。onDeleteClick洗掉了該檔案。onDeleteClick要求用戶確認他們想洗掉該檔案。onDeleteClick從資料庫中洗掉對該檔案的參考。從上面的內容可以看出,你在代碼中過早地洗掉了該檔案。如果用戶在第5步中點擊 "No",然后再次點擊Delete按鈕,錯誤就會從第2步開始,因為檔案已經消失了。
解決方案是在洗掉檔案之前要求確認:
@Override
public void onDeleteClick(int position) {
Upload selectedItem = mUploads.get(position)。
StorageReference imageRef = mStorage.getReferenceFromUrl(selectedItem.getmImageUrl())。
View view = LayoutInflater. from(ShowPatientsRecords.this).inflate(R.layout.alertdelete, null)。
Button no = view.findViewById(R.id.dltNo)。
Button yes = view.findViewById(R.id.dltYes);
AlertDialog dialog = new AlertDialog. Builder(ShowPatientsRecords.this).setView(view).create()。
dialog.setCancelable(false)。
dialog.show()。
yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Upload selectedItem = mUploads.get(position)。
final String selectedKey = selectedItem.getmKey()。
imageRef.delete().addOnSuccessListener(new OnSuccessListener<Void> () {
@Override
public void onSuccess(Void aVoid) {
mDatabaseRef.child(selectedKey).removeValue()。
dialog.dismiss()。
Toast.makeText(ShowPatientsRecords.this, "Record deleted", Toast.LENGTH_LONG).show()。
}
});
}
});
no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss()。
}
});
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321614.html
標籤:
