2017-04-20 129 views
0

我正在爲會員出席應記錄的俱樂部開發應用程序。我無法在列表視圖中正確獲取它。正確獲取Firebase數據

這裏是數據庫的一部分:

enter image description here

可能有不止一個運動參加像空手道或游泳某一天。我想在列表視圖中獲取該成員的出席人數。我會盡量在一天之後對其進行分區,但現在我需要正確地獲取數據。 這裏是我做出的模型:

public class MemberAttendance { 

private String day; 
private HashMap<String, Object> attendedSport; 


public MemberAttendance() { 

} 

public MemberAttendance(String day, HashMap<String, Object> attendedSport) { 

    this.day = day; 
    this.attendedSport = attendedSport; 

} 

public String getDay() { 
    return day; 
} 

public void setDay(String day) { 
    this.day = day; 
} 

public HashMap<String, Object> getAttendedSport() { 
    return attendedSport; 
} 

public void setAttendedSport(HashMap<String, Object> attendedSport) { 
    this.attendedSport = attendedSport; 
} 

}

這裏是適配器:

public class MemberAttendanceAdapter extends FirebaseListAdapter<MemberAttendance> { 

public MemberAttendanceAdapter(Activity activity, Class<MemberAttendance> modelClass, int modelLayout, Query ref) { 
    super(activity, modelClass, modelLayout, ref); 
} 

@Override 
protected void populateView(View view, MemberAttendance memberAttendance, int i) { 

    // Get values from firebase database 
    String day = memberAttendance.getDay(); 

    HashMap<String, Object> hashMap = memberAttendance.getAttendedSport(); 
    String sport = (String) hashMap.get("attended"); 
    String date = (String) hashMap.get("timestamp"); 

    // Create views and assign values 
    TextView dayTxtView = (TextView) view.findViewById(R.id.dayTxtView); 
    dayTxtView.setText(day); 

    TextView sportTxtView = (TextView) view.findViewById(R.id.sportTxtView); 
    sportTxtView.setText(sport); 

    TextView dateTxtView = (TextView) view.findViewById(R.id.dateTxtView); 
    dateTxtView.setText(date); 

} 

}

在這裏,我怎麼嘗試設置適配器:

 final FirebaseDatabase database = FirebaseDatabase.getInstance(); 

    final DatabaseReference attendanceRef = database.getReference() 
      .child(Constants.MEMBERS_NODE).child(userID).child("attendance"); 

    attendanceAdapter = new MemberAttendanceAdapter(getActivity(), MemberAttendance.class, 
      R.layout.attendance_list_item, attendanceRef); 

    attendanceListView.setAdapter(attendanceAdapter); 

到目前爲止,沒有工作,並就使用HashMap.get(..)對象引用空指針異常

String sport = (String) hashMap.get("attended"); 

任何幫助表示讚賞。

+0

的getAttendedSport HashMap試圖獲得一個名爲「attendSport」的節點,但沒有名爲「attendSport」的節點,而只是看起來像一個隨機ID。 – Linxy

回答

1

您可能要調整你的NoSQL數據庫是這樣的:

member 
---memberID 
------attendance 
---------attendance ID 
------------attended 
------------timestamp 
------------date 

例如:

member 
---member1 
------attendance 
---------attendance1 
------------soccer 
------------14938372834 
------------14-04-2017 
---------attendance2 
------------swimming 
------------14938374323 
------------14-04-2017 

你並不需要存儲的日期,因爲使用可以使用時間戳來創建Java中包含該信息的日期對象

Date date = new Date(timestamp); 

使用此結構y OU需要你的POJO改成這樣:

public class MemberAttendance { 

    private String attended; 
    private long timestamp; 


    public MemberAttendance() { 

    } 

    public MemberAttendance(String attended, long timestamp) { 

     this.attended = attended; 
     this.timestamp = timestamp; 

    } 

    public String getAttended() { 
     return attended; 
    } 

    public void setAttended(String attended) { 
     this.attended = attended; 
    } 

    public long getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(long timestamp) { 
     this.attendedSport = attendedSport; 
    } 
} 

然後你可以與適配器以下更改使用相同的火力地堡查詢:

public class MemberAttendanceAdapter extends FirebaseListAdapter<MemberAttendance> { 

    public MemberAttendanceAdapter(Activity activity, Class<MemberAttendance> modelClass, int modelLayout, Query ref) { 
     super(activity, modelClass, modelLayout, ref); 
    } 

    @Override 
    protected void populateView(View view, MemberAttendance memberAttendance, int i) { 

     String sport = memberAttendace.getAttended(); 
     Date date = new Date(memberAttendance.getTimestamp()); 

     // Create views and assign values 
     TextView dayTxtView = (TextView) view.findViewById(R.id.dayTxtView); 
     dayTxtView.setText(new SimpleDateFormat("dd-MM-yyyy").format(date);); 

     TextView sportTxtView = (TextView) view.findViewById(R.id.sportTxtView); 
     sportTxtView.setText(sport); 

     //I think you want to show the time here, not the date 
     TextView dateTxtView = (TextView) view.findViewById(R.id.dateTxtView); 
     dateTxtView.setText(new SimpleDateFormat("HH:mm:ss").format(date)); 

    } 
} 

編輯:關於你的評論在按日期查詢出勤,檢查I在上面的結構中做出的編輯,然後使用火力地堡查詢像

ref.child("members") 
    .child(<memberIdHere>) 
    .child("attendance") 
    .orderByChild("date") 
    .equalTo(<yourDateHere>); 
+0

這是一個正確的方法,謝謝。你能想出一種方法,以便我可以將屬於同一天的參加者組合到單個列表項目中嗎? – fullMoon

+0

如果您想按日期查詢它們,則可以使用Firebase查詢,其日期等於特定日期。我已經編輯了我的答案。我修改了結構。 –

1

而不是使用HashMap的我會建議創建像AttendedSport另一個對象變量中MemberAttendance然後Firebase將數據映射爲使用HashMappopulateView出來,你可以得到一個像

memberAttendance.getAttendedSport().getSport()memberAttendance.getAttendedSport().getTimeStamp()

數據我不能保證它能解決你的問題,但我認爲它不太容易出錯。