2016-10-06 7 views
2

Firebaseのlistviewを以下のように使用していますが、それは魅力的ですが、問題は、リストビュー(lv)の最後に子の最後のプッシュされたキー( "Posts"私は最後に押されたキーが何よりも表示されるようにするか、日付でソートすることができればいいです。Firebaseでデータを並べ替える

query = ref.child("Posts").orderByKey(); 
    FirebaseListAdapter<ChatRoomJ> adapter = new FirebaseListAdapter<ChatRoomJ>(
      ChatRoom.this, 
      ChatRoomJ.class, 
      R.layout.lvchatroom,query 
    ) { 
     @Override 
     protected void populateView(View v, ChatRoomJ model, final int position) { 

      final String date = model.getDate(); 
      final String displayName = model.getDisplayName(); 

      ((TextView) v.findViewById(R.id.displayname)).setText(displayName); 
      ((TextView) v.findViewById(R.id.datel)).setText(date); 


      }); 

     } 
    }; 
    lv.setAdapter(adapter); 
+0

データベースにキーを追加すると、 'push'を使用します。つまり、すべてが固有のfirebase生成IDを持っていますか? – Ryan

+0

はい、まさに.. ref.child( "投稿")。push()。SetValue(ChatRoomJ); –

答えて

2

方法1:

あなたがFirebaseListAdapterを拡張する独自のクラスを作るとのgetItem()メソッドをオーバーライドしない限り、あなたの現在のコードとデータの順序を変更する方法はありません。これはすばらしい、簡単な方法です(Monet_z_Polskiの礼儀です)。私は今までのところ完璧な結果で同じトリックを使いました。

public abstract class ReverseFirebaseListAdapter<T> extends FirebaseListAdapter<T> { 

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

public ReverseFirebaseListAdapter(Activity activity, Class<T> modelClass, int modelLayout, DatabaseReference ref) { 
    super(activity, modelClass, modelLayout, ref); 
} 

@Override 
public T getItem(int position) { 
    return super.getItem(getCount() - (position + 1)); 
} 

アダプタを作成すると、新しいカスタムクラスを使用して、リストに送信される各アイテムの開始位置が変更されます。

方法2:

他の方法は、(おそらくそのようなArrayListのか何かに)あなたのアプリにデータを読み取り、適切にリストを移入する前に、クライアント上のデータを並べ替えることであろう順序付けられたデータ。これは、各項目の開始インデックスが0のArrayListにデータを読み込むのと同じくらい簡単です。例えばchatRoomList.add(0, nextChatRoom);のようなものです。こうすれば、画面にリストを表示するときに、望む順番で表示されます。

カスタムアダプターの作成には他の方法もありますが、私は個人的にはこれらの2つの方法よりも複雑であると思います。最初は私のお気に入りです。

+0

あなたの返事をありがとう、私は最初のものと一緒に行くだろうと思うが、私はすべてのユニークなキーとタイムスタンプを追加するので、私はそれらを注文するタイムスタンプを使用することはできません? –

+0

各インスタンスのChatRoomJ.class内にメンバー変数としてタイムスタンプを追加していますか、または実際の一意のキーにタイムスタンプを追加していますか(生成されたキーを変更しますか) – Ryan

+0

ChatRoomJ.classで追加しましたが、私はこの方法を追加ref.child( "投稿")。子(キー).setValue(chatRoomJ);ref.child( "投稿")。子(キー).child( "タイムスタンプ")。setValue(ServerValue.TIMESTAMP);私はただタイムスタンプの値を負に変更したいが、方法を見つけることができない、私はコンソールから値を負に変更し、それが働いた。 –

関連する問題