You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Firestore获取数据并提取对象值到ListView的实现问题

Complete Guide to Extract Firestore Data & Populate ListView

Got it, let's wrap this up step by step. I’ll assume your Firestore document has fields like inviteeName, splitAmount, and invitationStatus—adjust these to match your actual field names. Here’s how to tie everything together:

Step 1: Define a Model Class for Clean Data Management

First, create a simple POJO (Plain Old Java Object) to hold your invitation data. This makes handling and passing data way cleaner:

public class Invitation {
    private String inviteeName;
    private double splitAmount;
    private String invitationStatus;

    // Empty constructor is required for Firestore deserialization
    public Invitation() {}

    public Invitation(String inviteeName, double splitAmount, String invitationStatus) {
        this.inviteeName = inviteeName;
        this.splitAmount = splitAmount;
        this.invitationStatus = invitationStatus;
    }

    // Getters are needed to access the fields in the adapter
    public String getInviteeName() { return inviteeName; }
    public double getSplitAmount() { return splitAmount; }
    public String getInvitationStatus() { return invitationStatus; }
}

Step 2:完善 Firestore Callback Logic

Update your existing onComplete method to extract data, populate your list, and refresh the ListView. Remember to handle UI updates on the main thread!

// Initialize your ListView (do this in onCreate or your UI setup section)
ListView invitationListView = findViewById(R.id.your_listview_id);
// Create an ArrayList to store your invitation data
ArrayList<Invitation> invitationList = new ArrayList<>();

DocumentReference docRef = db.collection("deyaPayUsers").document(mAuth.getUid())
        .collection("Split").document(mAuth.getUid())
        .collection("SentInvitations").document(documentId);

docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                // Map Firestore document directly to your Invitation object
                Invitation invitation = document.toObject(Invitation.class);
                
                // Add the extracted data to your list (if it's not null)
                if (invitation != null) {
                    invitationList.add(invitation);
                }

                // Update ListView on the MAIN THREAD—critical for UI changes!
                runOnUiThread(() -> {
                    InvitationAdapter adapter = new InvitationAdapter(YourActivity.this, invitationList);
                    invitationListView.setAdapter(adapter);
                });
            } else {
                Log.d("Firestore", "No matching document found");
            }
        } else {
            Log.d("Firestore", "Fetch failed: ", task.getException());
            // Optional: Show a toast to inform the user of the error
            runOnUiThread(() -> Toast.makeText(YourActivity.this, "Failed to load data", Toast.LENGTH_SHORT).show());
        }
    }
});

Step 3: Build a Custom ListView Adapter

First, create a layout for each list item (name it list_item_invitation.xml):

<!-- res/layout/list_item_invitation.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_invitee_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/tv_split_amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"/>

    <TextView
        android:id="@+id/tv_invitation_status"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"
        android:textColor="@color/gray"/>
</LinearLayout>

Then create the adapter class to bind your data to the layout:

public class InvitationAdapter extends ArrayAdapter<Invitation> {

    private Context context;
    private ArrayList<Invitation> invitations;

    public InvitationAdapter(Context context, ArrayList<Invitation> invitations) {
        super(context, 0, invitations);
        this.context = context;
        this.invitations = invitations;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        // Reuse existing view to save memory
        View listItem = convertView;
        if (listItem == null) {
            listItem = LayoutInflater.from(context).inflate(R.layout.list_item_invitation, parent, false);
        }

        // Get the current invitation from the list
        Invitation currentInvite = invitations.get(position);

        // Populate each TextView with data
        TextView inviteeName = listItem.findViewById(R.id.tv_invitee_name);
        inviteeName.setText(currentInvite.getInviteeName());

        TextView splitAmount = listItem.findViewById(R.id.tv_split_amount);
        splitAmount.setText(String.format("Amount: $%.2f", currentInvite.getSplitAmount()));

        TextView status = listItem.findViewById(R.id.tv_invitation_status);
        status.setText("Status: " + currentInvite.getInvitationStatus());

        return listItem;
    }
}

Quick Tips to Avoid Issues

  • Field Matching: Make sure your Invitation class field names exactly match those in Firestore (case-sensitive!). If they don’t, use @PropertyName("firestore_field_name") above the corresponding class field.
  • UI Thread Rule: Never update UI elements from a background thread—using runOnUiThread ensures your ListView updates safely.
  • Error Handling: Expand the logging/toast messages to give users clear feedback if something goes wrong.

内容的提问来源于stack exchange,提问作者vijju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:57:18