2016-12-30 43 views
1

我從火力地堡數據庫填充一個ListView:從火力地堡數據庫移植ListView

這是我的代碼:

final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl(".../comunidades"); 

    FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
      this.getActivity(), 
      String.class, 
      android.R.layout.simple_list_item_1, 
      databaseReference 
    ) { 
     @Override 
     protected void populateView(View v, String model, int position) { 
      TextView textView = (TextView) v.findViewById(android.R.id.text1); 
      textView.setText(model); 
      mProgress.dismiss(); 

     } 
    }; 

這是該數據庫的火力地堡控制檯,分支:「comunidades」:

enter image description here

但我使用相同的代碼在另一個片段來自同一DAT填充從另一個分支對象列表視圖基地,但我得到一個錯誤。

這是新代碼:

final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl(".../Enclaves"); 

    FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
      this.getActivity(), 
      String.class, 
      android.R.layout.simple_list_item_1, 
      databaseReference 
    ) { 
     @Override 
     protected void populateView(View v, String model, int position) { 
      TextView textView = (TextView) v.findViewById(android.R.id.text1); 
      textView.setText(model); 


     } 
    }; 

我應該改變,以獲得從分支「飛地」關鍵「Nombre_enclave」的值:

enter image description here

+2

有什麼錯誤? @NewAtFirebase – Lyla

+0

您的FirebaseListAdapter無法保存字符串。它需要是映射到存儲在Firebase中的模型的對象。具有「Nombre_enclave」字符串字段的對象 –

+0

@NewAtFirebase:我在下面提供了一個答案。但對於未來的問題,請提供您的JSON作爲文本,而不是截圖。您可以通過單擊Firebase數據庫控制檯中的導出JSON鏈接輕鬆獲取文本。將JSON作爲文本使其可搜索並使我們能夠在我們的評論和答案中輕鬆使用它。 –

回答

4

你有什麼根據enclaves不是一個String + String對的列表。相反,它是字符串+對象對的列表,有,有Comunidad_enclave,Descripcion_enclave每個對象等

,使這項工作的最快方式是決定你想要的屬性來顯示,然後覆蓋parseSnapshot()

FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
     this.getActivity(), 
     String.class, 
     android.R.layout.simple_list_item_1, 
     databaseReference 
) { 
    @Override 
    protected String parseSnapshot(DataSnapshot snapshot) { 
     return snapshot.child("Comunidad_enclave").getValue(String.class); 
    } 

    @Override 
    protected void populateView(View v, String model, int position) { 
     TextView textView = (TextView) v.findViewById(android.R.id.text1); 
     textView.setText(model); 
    } 
}; 

解決此問題的更好方法是創建一個代表每個comunidad的類。在最簡單的形式,可以是這樣的:

class Comunidad { 
    public String Comunidad_enclave; 
    public String Descripcion__enclave; 
    // TODO: the same for the other properties 
} 

有了這個類,你可以讓你Comunidad類型的適配器:

FirebaseListAdapter<Comunidad> firebaseListAdapter = new FirebaseListAdapter<Comunidad>(
     this.getActivity(), 
     String.class, 
     android.R.layout.simple_list_item_2, 
     databaseReference 
) { 
    @Override 
    protected void populateView(View v, Comunidad model, int position) { 
     TextView textView1 = (TextView) v.findViewById(android.R.id.text1); 
     textView1.setText(model.Comunidad_enclave); 
     TextView textView2 = (TextView) v.findViewById(android.R.id.text2); 
     textView2.setText(model.Descripcion_enclave); 
    } 
}; 
+0

它的工作原理,謝謝,但我不明白它的工作原理。 parseSnapShot方法如何完成這項工作? – NewAtFirebase

+0

當您不重寫'parseSnapshot()'時,適配器會自動將'DataSnapshot'轉換爲您在構造函數中指定的類(在您的情況下爲'String')。由於您的商品在第二種情況下不是簡單的字符串,因此該轉換不會導致任何結果。通過重載'parseSnapshot()',你可以控制什麼數據被傳入'populateView()'。查看適配器的代碼,這是令人驚訝的小。相關部分是:https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/com/firebase/ui/database/FirebaseListAdapter.java#L118 –

+0

謝謝你的時間和努力。我已經在這裏看到你的貢獻,我在他們身上學到了很多東西。 – NewAtFirebase