0

私のアプリケーションは、firebase から ListView のボタンに最新のデータを返しています。でも一番上になりたい!私はそれについて考えましたが、それを行うには2つの方法しかないと思います。

1. リストビューを反転します。
このようにするべきだと思いますが、わかりませんでした。私はウェブでたくさん検索しましたが、私のケースに適した解決策はありません
これは私のアダプターコードです

 public void onStart() {
        super.onStart();
        // Setup our view and list adapter. Ensure it scrolls to the bottom as data changes
        final ListView listView = getListView();
        // Tell our list adapter that we only want 50 messages at a time
        mChatListAdapter = new ChatListAdapter(mFirebaseRef.limit(50), this, R.layout.chat_message, mUsername);
        listView.setAdapter(mChatListAdapter);
}

そして、これは特別なリスト アダプター クラスを拡張ChatListAdapterするカスタム リスト クラスのコンストラクターのコードです。ChatListAdapterFirebaseListAdapter

public ChatListAdapter(Query ref, Activity activity, int layout, String mUsername) {
    super(ref, Chat.class, layout, activity);
    this.mUsername = mUsername;
}

[編集]これはクラスFirebaseListAdapterを拡張するコードの一部ですBaseAdapter

 public FirebaseListAdapter(Query mRef, Class<T> mModelClass, int mLayout, Activity activity) {
    this.mRef = mRef;
    this.mModelClass = mModelClass;
    this.mLayout = mLayout;
    mInflater = activity.getLayoutInflater();
    mModels = new ArrayList<T>();
    mModelKeys = new HashMap<String, T>();
    // Look for all child events. We will then map them to our own internal ArrayList, which backs ListView
    mListener = this.mRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {

            T model = dataSnapshot.getValue(FirebaseListAdapter.this.mModelClass);
            mModelKeys.put(dataSnapshot.getKey(), model);

            // Insert into the correct location, based on previousChildName
            if (previousChildName == null) {
                mModels.add(0, model);
            } else {
                T previousModel = mModelKeys.get(previousChildName);
                int previousIndex = mModels.indexOf(previousModel);
                int nextIndex = previousIndex + 1;
                if (nextIndex == mModels.size()) {
                    mModels.add(model);
                } else {
                    mModels.add(nextIndex, model);
                }
            }
        }

2. データを降順でクエリします。
Firebase API ドキュメントと Web で検索したときに、取得したデータを降順で並べ替える方法が見つからなかったため、2 番目の方法は私には不可能です。
firebase の私のデータは次のようになります。

glaring-fire-9714 
    chat
        -Jdo7-l9_KBUjXF-U4_c
            author: Ahmed
            message: Hello World
        -Jdo71zU5qsL5rcvBzRl
            author: Osama
            message: Hi!


ありがとうございました。

4

3 に答える 3

2

簡単な解決策は、新しく追加されたデータを手動で の先頭に移動することlistviewです。お気づきのとおり、に追加された新しいデータlistviewは自動的にリストの一番下に追加されますが、追加されたエントリは自由に移動できます。次のようなものは、最新のエントリをリストの一番上に手動で移動するのに役立ちます。

int iSwapCount = listView.getCount() - 1;
int iPosition = listView.getCount() - 1;
for (int j = 0; j < iSwapCount; j++)
{
    Collections.swap(yourlistobject, iPosition, iPosition - 1);
    iPosition = iPosition - 1;
}

上記のコードは、最後のリスト エントリをリストの先頭に移動するために必要なスワップの数を計算することから始めます。これは、リスト内の要素の数 - 1 によって決定されます。最後の位置の計算についても同じことが言えます。リストで。そこからCollections.swap、リストの最後の要素をその前の要素と交換するために使用されます。これは、最後の要素が最初の要素になるまで繰り返され、リスト内の残りのエントリは同じ順序のままです。このコードは、リストの全体的な順序が維持されるように、新しいエントリが追加されるたびに呼び出す必要があります。

于 2014-12-23T00:31:20.840 に答える
1

RecyclerView を使用して FirebaseUI リストを反転する簡単な方法を次に示します。

    boolean reverseList = true;
    LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, reverseList);
    if (reverseList) {
        manager.setStackFromEnd(true);
    }
    mRecyclerView.setLayoutManager(manager);
于 2017-07-15T22:32:33.497 に答える