![](/img/trans.png)
[英]RecyclerView does not update after removing an item from the Firestore
[英]How to update an item in Firestore RecyclerView?
我正在嘗試使用工具欄上的保存按鈕updateQuestion()
調用updateQuestion()
更新RecyclerView
的項目。
我的Firebase中具有以下結構:
Questions
-> list_of_documents wUniqueIDs
--->文檔中的字段:
+ question
+ answer
+ rating
到目前為止,我在updateQuestion()
下擁有此updateQuestion()
private void updateQuestion() {
String questionString = mQuestionTextView.getText().toString();
Object updatedText = mQuestionEditText.getText().toString();
String questionPath2 = rootRef.collection("Questions").document().getPath();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference collectionReference = rootRef.collection(questionPath2).document().update("question", updatedText); // <--- I GET ERROR HERE
}
error: incompatible types: Task<Void> cannot be converted to CollectionReference
我也收到一個錯誤,之前說的是update()
的第二個參數需要是一個對象,但是這個錯誤似乎已經消失了。
我一直在嘗試遵循教程,並在stackOverflow上查看其他文章,但似乎都沒有解決這個問題。
這是我以前嘗試過的:
// CollectionReference ref = rootRef.collection("Questions").document().collection("question");
// CollectionReference ref = rootRef.collection("Questions").document().collection(questionPath);
// Toast.makeText(this, "this is the path: " + questionPath, Toast.LENGTH_SHORT).show();
// Log.d(TAG, "updateQuestion: " + ref.get(question.getAnswer));
// Log.d(TAG, "updateQuestion: " + ref.collection(questionPath).document("question", questionPath).toString())
// Log.d(TAG, "updateQuestion: " + ref.document(questionPath)("question").toString());
// Log.d(TAG, "updateQuestion: " + ref.document(questionPath).get(question).toString());
// ref.collection("question")
// db.child("Spacecraft").push().setValue(spacecraft);
// rootRef.collection("Questions").document().update("question", updatedText);
// rootRef.collection("Questions").document(questionPath).update("question", updatedText);
// TextView savedText = mQuestionTextView.setText(updatedText);
// DocumentReference documentReference = rootRef.collection("Questions").document(questionPath).update("question", );
// DocumentReference documentReference = rootRef.document(questionPath).update("question", updatedText);
// CollectionReference collectionReference = rootRef.collection(questionPath).document().update("question", updatedText);
任何和所有幫助表示贊賞。
------------------ 修訂版代碼截至2019年4月7日@ 1153pm ---------
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.save_question:
mShowSaveIcon = false;
updateQuestion();
break;
case R.id.edit_question:
item.setVisible(false);
enableEditMode();
mShowSaveIcon = true;
break;
}
invalidateOptionsMenu();
return true;
}
private void enableEditMode(){
mQuestionEditText = findViewById(R.id.questionEditTextID);
mPostAnswerButton.setEnabled(false);
mPostAnswerButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));
mCommentButton.setEnabled(false);
mCommentButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));
String questionString = mQuestionTextView.getText().toString();
mQuestionTextView.setVisibility(View.GONE);
mQuestionEditText.setVisibility(View.VISIBLE);
mQuestionEditText.setText(questionString);
}
private void updateQuestion(){
Question question = createQuestionObj();
updateQuestionToCollection(question);
}
private Question createQuestionObj(){
final Question question = new Question();
return question;
};
private void updateQuestionToCollection(Question question) {
String questionString = mQuestionTextView.getText().toString();
Object updatedText = mQuestionEditText.getText().toString();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
String docId = rootRef.collection("Questions").document().getId();
System.out.println(docId);
String questionPath = rootRef.collection("Questions").document(docId).collection("question").getPath();
// String questionPath2 = rootRef.collection("Questions").document(docId).getPath();
System.out.println(questionPath);
rootRef.collection(questionPath).document(docId).update("question", updatedText).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "onSuccess: it worked");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "onFailure: it failed because of: " + e.toString());
}
});
finish();
}
};
下面的數據庫結構片段
當我查看您的代碼時,我看到兩個問題。 第一個是以下錯誤:
error: incompatible types: Task<Void> cannot be converted to CollectionReference
之所以產生這種情況是因為,當您在DocumentReference
對象上調用update()
方法時,返回的對象的類型為Task<Void>
而不是 CollectionReference
。 另請注意,Java中無法將CollectionReference對象強制轉換為Task。 因此,要解決此問題,只需刪除您的collectionReference
對象的聲明,如下所示:
rootRef.collection(questionPath2).document("specificDocId").update("question", updatedText);
第二個問題是,每次調用updateQuestion()
時都會生成一個新的文檔ID,因為您沒有將任何ID傳遞給document()
方法。 為了能夠更新特定的文檔,您需要傳遞文檔的實際ID,以便可以對其進行更新:
rootRef.collection(questionPath2).document("specificDocId").update("question", updatedText);
編輯:
為了更新文檔,請使用以下參考:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference questionsRef = rootRef.collection("questions");
DocumentReference docRef = questionsRef.document("yCCRgoRIAmtmKmTFLYJX");
docRef.update("question", updatedText);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.