Android 如何将DocumentReference传递给DetailActivity?

Android 如何将DocumentReference传递给DetailActivity?,android,firebase,android-recyclerview,google-cloud-firestore,master-detail,Android,Firebase,Android Recyclerview,Google Cloud Firestore,Master Detail,我使用Firebase存储数据,Master/Detail活动显示文档列表,当用户单击其中任何一个时,Detail活动应显示该文档的数据 问题是我无法将DocumentReference(Firebase提供的类)发送到具有intent的DetailActivity。由于DocumentReference不可序列化,因此putExtra() 这是我的相关代码: ListActivity.java OnClickListener用于列表项,在my RecyclerView上的onBindViewH

我使用Firebase存储数据,Master/Detail活动显示文档列表,当用户单击其中任何一个时,Detail活动应显示该文档的数据

问题是我无法将
DocumentReference
(Firebase提供的类)发送到具有
intent的DetailActivity。由于
DocumentReference
不可序列化,因此putExtra()

这是我的相关代码:

ListActivity.java OnClickListener用于列表项,在my RecyclerView上的
onBindViewHolder

final View.OnClickListener mOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Expense item = (Expense) view.getTag();
        if (item != null) {
            Context context = view.getContext();
            Intent intent = new Intent(context, DetailActivity.class);
            intent.putExtra(DetailFragment.ARG_ITEM_ID, item);
            context.startActivity(intent);
        }
        else {
            Log.e(TAG, "item is null");
        }
    }
};
DetailFragment.java Expense.java
而不是传递
文档引用
传递集合和文档的
名称
,并在
详细活动中重构文档引用

public class Expense implements Serializable {

    public DocumentReference id;
    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    .......

    public void setId(DocumentReference id) { this.id = id; }
    ......
public class Expense implements Serializable {

    //add these instead of DocumentReference
    public String CollectionName;
    public String DocumentName;

    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    ........
    .......

    public void setCollectionName(String name) { this.CollectionName= name; }
    public void setDocumentName(String name) { this.DocumentName= name; }   ......
    .............
    Context context = view.getContext();
    Intent intent = new Intent(context, DetailActivity.class);
    //add these
    item.setCollectionName("YOUR_COLLECTION_NAME");
    item.setDocumentName("YOUR_DOCUMENT_NAME");

    intent.putExtra(DetailFragment.ARG_ITEM_ID, item);
    context.startActivity(intent); 
    ...............
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments().containsKey(ARG_ITEM_ID)) {
        Log.d(TAG, getArguments().getSerializable(ARG_ITEM_ID).toString());
        Expense item = (Expense) getArguments().getSerializable(ARG_ITEM_ID);

        //reconstruct the document reference
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        DocumentReference docRef = db.collection(item.CollectionName).document(item.DocumentName);
        Log.d(TAG, "Received="+item.toString());
    }
}
这个:

public class Expense implements Serializable {

    public DocumentReference id;
    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    .......

    public void setId(DocumentReference id) { this.id = id; }
    ......
public class Expense implements Serializable {

    //add these instead of DocumentReference
    public String CollectionName;
    public String DocumentName;

    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    ........
    .......

    public void setCollectionName(String name) { this.CollectionName= name; }
    public void setDocumentName(String name) { this.DocumentName= name; }   ......
    .............
    Context context = view.getContext();
    Intent intent = new Intent(context, DetailActivity.class);
    //add these
    item.setCollectionName("YOUR_COLLECTION_NAME");
    item.setDocumentName("YOUR_DOCUMENT_NAME");

    intent.putExtra(DetailFragment.ARG_ITEM_ID, item);
    context.startActivity(intent); 
    ...............
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments().containsKey(ARG_ITEM_ID)) {
        Log.d(TAG, getArguments().getSerializable(ARG_ITEM_ID).toString());
        Expense item = (Expense) getArguments().getSerializable(ARG_ITEM_ID);

        //reconstruct the document reference
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        DocumentReference docRef = db.collection(item.CollectionName).document(item.DocumentName);
        Log.d(TAG, "Received="+item.toString());
    }
}
变成:

public class Expense implements Serializable {

    public DocumentReference id;
    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    .......

    public void setId(DocumentReference id) { this.id = id; }
    ......
public class Expense implements Serializable {

    //add these instead of DocumentReference
    public String CollectionName;
    public String DocumentName;

    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    ........
    .......

    public void setCollectionName(String name) { this.CollectionName= name; }
    public void setDocumentName(String name) { this.DocumentName= name; }   ......
    .............
    Context context = view.getContext();
    Intent intent = new Intent(context, DetailActivity.class);
    //add these
    item.setCollectionName("YOUR_COLLECTION_NAME");
    item.setDocumentName("YOUR_DOCUMENT_NAME");

    intent.putExtra(DetailFragment.ARG_ITEM_ID, item);
    context.startActivity(intent); 
    ...............
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments().containsKey(ARG_ITEM_ID)) {
        Log.d(TAG, getArguments().getSerializable(ARG_ITEM_ID).toString());
        Expense item = (Expense) getArguments().getSerializable(ARG_ITEM_ID);

        //reconstruct the document reference
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        DocumentReference docRef = db.collection(item.CollectionName).document(item.DocumentName);
        Log.d(TAG, "Received="+item.toString());
    }
}
在发送意向中的项目之前:

public class Expense implements Serializable {

    public DocumentReference id;
    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    .......

    public void setId(DocumentReference id) { this.id = id; }
    ......
public class Expense implements Serializable {

    //add these instead of DocumentReference
    public String CollectionName;
    public String DocumentName;

    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    ........
    .......

    public void setCollectionName(String name) { this.CollectionName= name; }
    public void setDocumentName(String name) { this.DocumentName= name; }   ......
    .............
    Context context = view.getContext();
    Intent intent = new Intent(context, DetailActivity.class);
    //add these
    item.setCollectionName("YOUR_COLLECTION_NAME");
    item.setDocumentName("YOUR_DOCUMENT_NAME");

    intent.putExtra(DetailFragment.ARG_ITEM_ID, item);
    context.startActivity(intent); 
    ...............
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments().containsKey(ARG_ITEM_ID)) {
        Log.d(TAG, getArguments().getSerializable(ARG_ITEM_ID).toString());
        Expense item = (Expense) getArguments().getSerializable(ARG_ITEM_ID);

        //reconstruct the document reference
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        DocumentReference docRef = db.collection(item.CollectionName).document(item.DocumentName);
        Log.d(TAG, "Received="+item.toString());
    }
}
DetailFragment.java中的

public class Expense implements Serializable {

    public DocumentReference id;
    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    .......

    public void setId(DocumentReference id) { this.id = id; }
    ......
public class Expense implements Serializable {

    //add these instead of DocumentReference
    public String CollectionName;
    public String DocumentName;

    private String TAG = "Expense";

    private Timestamp timestamp;
    private float amount;
    private String description;
    ........
    .......

    public void setCollectionName(String name) { this.CollectionName= name; }
    public void setDocumentName(String name) { this.DocumentName= name; }   ......
    .............
    Context context = view.getContext();
    Intent intent = new Intent(context, DetailActivity.class);
    //add these
    item.setCollectionName("YOUR_COLLECTION_NAME");
    item.setDocumentName("YOUR_DOCUMENT_NAME");

    intent.putExtra(DetailFragment.ARG_ITEM_ID, item);
    context.startActivity(intent); 
    ...............
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments().containsKey(ARG_ITEM_ID)) {
        Log.d(TAG, getArguments().getSerializable(ARG_ITEM_ID).toString());
        Expense item = (Expense) getArguments().getSerializable(ARG_ITEM_ID);

        //reconstruct the document reference
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        DocumentReference docRef = db.collection(item.CollectionName).document(item.DocumentName);
        Log.d(TAG, "Received="+item.toString());
    }
}

嗨,尼基!我把这个问题标为重复问题,因为它已经有答案了。所以,请检查副本,看看如何解决这个问题。