2017-02-15 6 views
0

何か簡単な方法を見つけるのが難しいです。私は、カスタムArrayAdapterでアンドロイドのリストビューに値を設定しています。私はこのコードを使用してリストビューを作成します:FirebaseでOnItemClickListenerを使用する

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

これは機能します。私はそうのように私のリストビュー内の項目に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

didntのは本当に、あなたがルートクラスにマッピングされ、追加されたデータを持っているあなたの質問を取得しますどのように私は理解できないのですか?ここでは、SingleRoute.classからデータベースを照会する方法は何ですか? –

+0

申し訳ありませんが、私はもっと明確にできました。私は私のデータベース内のオブジェクトからの情報を持つリストビューを持っています。私がビューをクリックすると、データベースオブジェクトに含まれるより詳細な情報を入力できる新しいアクティビティを起動します。 – Kyle

+0

その後、 'startActivity(i);'を実行しているときにonClickで、インテントを持つ詳細な情報オブジェクトを含み、アクティビティにアクセスする 'route-> routelist.get(position)'を渡すことができます。 –

答えて

0

新しい子のFirebase SDK情報あなたは、それはあなたのgetKey()getValue()が含まれているDataSnapshotを与えるとき。あなたのコードにsと呼ばれるpreviousKeyも渡されます。

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

あなたのコードはgetKey()previousKey無視して、唯一のアダプタ用のスナップショットのgetValue()をとります。この情報の損失は、クリックされたアイテムの位置を基になるデータベースノードのキーにマッピングするなど、特定の作業を行えないようにします。

この後方マッピングを許可するには、スナップショットのキーと値の両方をアダプタに保存する必要があります。正確な実装は、あなた次第ですが、あなたはそれが好きで起動したい:これは、項目がリストに表示されるべき場所に関する重要な情報が含まれていてもよいとあなたは本当に、previousKeyを無視するべきではありません

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

。当初、追加専用リストを持つことは非常に一般的ですが、これはしばしば時間とともに変化します。アダプターは、それが正しい場所にアイテムを挿入するために、キーに戻し位置からマップするために必要なすべての情報を持っていることを確認するには、次の

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

ありがとう!コードを使って作業しますが、正しい軌跡のように感じます。私は最良の実装については分かりませんが、私は、ルートとキーを含む単純なラッパークラスを作成し、それをアダプターに渡そうとします。私は、その目的のキーをSingleRouteActivityに送り、そこでデータベースに問い合わせます。ありがとう! udacityに関するあなたのチュートリアルは素晴らしいです。 – Kyle

関連する問題