2017-02-15 43 views
0

我無法找到如何做簡單的事情。我使用自定義ArrayAdapter在Android中填充ListView。我使用此代碼來填充列表視圖:將OnItemClickListener與Firebase結合使用

mRouteListener = new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       Route route = dataSnapshot.getValue(Route.class); 
       adapter.add(route); 
      } 

This works。我想設置一個OnItemClickListener的物品在我的列表視圖像這樣:

ListView routeListView = (ListView) findViewById(R.id.list); 

     // Find and set empty view on the ListView, so that it only shows when the list has 0 items. 
     View emptyView = findViewById(R.id.empty_view); 
     routeListView.setEmptyView(emptyView); 

     ArrayList<Route> routeList = new ArrayList<>(); 
     adapter = new RouteAdapter(this, routeList); 
     // may want to change this to FirebaseAdapter 

     routeListView.setAdapter(adapter); 

     routeListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Intent i = new Intent(Wall10Activity.this, SingleRouteActivity.class); 
       // I want to start a new activity then query the db to populate the information. 
       startActivity(i); 
      } 
     }); 

我想不通的是如何查詢從SingleRoute.class數據庫從視圖中的所有數據,他們點擊。我無權訪問隨機生成的密鑰。它存儲就像這樣:

{ 

    "routes" : { 

    "-KcyQUzuVogjq3yPnr9u" : { 

     "color" : 0, 

     "grade" : 10, 

     "name" : "YELLOW" 

    } 

    } 

} 
+0

Did not really get your question,you have data mapped to Route class and added到適配器..什麼'我無法弄清楚是如何從SingleRoute.class'查詢數據庫的意思? –

+0

對不起,我可以更清楚。我有一個列表視圖,其中包含來自數據庫中對象的信息。當我點擊一個視圖時,我想啓動一個新的活動,我可以使用數據庫對象中包含的更詳細信息來填充該活動。 – Kyle

+0

然後在執行'startActivity(i)'的時候onClick;'你可以通過'route-> routelist.get(position)'這個包含詳細信息對象的intent並在activity中訪問它。 –

回答

0

當一個新的子的火力地堡SDK的信息你,它給你一個DataSnapshot,其中包含一個getKey()getValue()。您還通過了previousKey,在您的代碼中稱爲s

public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) { 
    Route route = dataSnapshot.getValue(Route.class); 
    adapter.add(route); 
} 

您的代碼忽略getKey()previousKey,只需要快照用於適配器的getValue()。這種信息丟失使得不可能做某些事情,比如將被單擊的項目的位置映射回底層數據庫節點的鍵。

要允許此向後映射,您必須將快照的密鑰和值保留在適配器中。確切的實現是你的,但你會調用它想:

public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) { 
    Route route = dataSnapshot.getValue(Route.class); 
    adapter.add(dataSnapshot.getKey(), route); 
} 

你真的不應該忽視previousKey,因爲這可能會包含有關禁止的項目應在列表中顯示重要信息。雖然最初確實有一個只有追加名單的情況非常普遍,但這種情況經常會隨着時間而改變。爲確保適配器具有將物品插入正確位置並將位置映射回某個位置所需的所有信息:

public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) { 
    Route route = dataSnapshot.getValue(Route.class); 
    adapter.add(dataSnapshot.getKey(), route, previousKey); 
} 
+0

謝謝!我將使用代碼,但感覺就像是正確的方向。我不確定最好的實現,但我會嘗試爲Route創建一個簡單的包裝類,其中包含密鑰和路由並將其傳遞給適配器。那麼我會將意圖中的密鑰發送到我的SingleRouteActivity並在那裏查詢數據庫。謝謝!順便說一句,關於udacity的教程很棒。 – Kyle