2014-12-22 3 views
0

Мое приложение возвращает последние данные из firebase в buttom ListView. Но я хочу, чтобы это было на вершине! Я подумал об этом, и я думаю, что есть только два возможных способа сделать это.Android FireBase change Listview order

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 конструктор для пользовательского списка класса ChatListAdapter, который проходит специальное список адаптеров класса FirebaseListAdapter:

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 и в Интернете, я не мог найти все равно, чтобы заказать восстановленные данные по убыванию.
Мои данные о firebase выглядеть следующим образом:

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


Спасибо.

+0

Почему не могли бы вы сделайте что-то вроде mFirebaseRef.orderByChild («ключ»). limit (50), как описано в этом сообщении: https://www.firebase.com/docs/android/guide/retrieving-data .html # section-queries –

+0

@MichaelKrause Я пробовал это, но это не вызывает уважения. Сортируется по возрастанию – sabsab

+0

Вы не можете изменить порядок сортировки. Но то, что вы можете изменить, - это взять первые элементы ('limitToFirst') или последние элементы (' limitToLast'). После этого вы можете инвертировать элементы в вашем Java-коде. Фактически, вы * должны * уже делать это, так как более поздние предметы могут выходить из строя. Используйте параметр 'previousChild', чтобы определить, где новый элемент принадлежит в последовательности. –

ответ

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 будет использоваться для замены последнего элемента в списке с элементом перед ним; это будет повторяться до тех пор, пока последний элемент не станет первым элементом, а остальные записи в списке останутся в том же порядке. Этот код нужно будет вызывать каждый раз, когда добавляется новая запись, чтобы поддерживать общий порядок списка.

+0

Я пытаюсь, но у меня нет идеи, что я должен положить вместо вашего списка? – sabsab

+0

«yourlistobject» будет заменен всем, в чем состоит ваш список. Я не знаком с 'ChatListAdapter', поэтому я не совсем уверен, что в вашем списке есть, но' Collections.swap' будет менять элементы в «ListView», поэтому передайте все, что ваш список состоит из этого метода. – Willis

+0

Не могли бы вы еще раз проверить сообщение, я отредактировал вопрос с помощью FirebaseListAdapter ... Я уверен, что это то место, которое мне следовало бы обменивать – sabsab

2

Я понимаю, что прошло некоторое время с тех пор, как вы спросили, но у меня была та же проблема. Не кажется, что здесь есть прямой ответ.

Это переход к адаптеру firebase для получения новых элементов в верхней части списка.

Обратите внимание, что изменения добавлены (...) для добавления (0, ...) и добавления (далее ...) для добавления (пред ...)

Посмотрите на комментарии:

   // prepend instead append 

Пример:

... 

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

      if (nextIndex == mModels.size()) { 
       //mModels.add(model); 
       //mKeys.add(key); 

       // prepend instead append 
       mModels.add(0,model); 
       mKeys.add(0,key); 
      } else { 
       //mModels.add(nextIndex, model); 
       //mKeys.add(nextIndex, key); 

       // prepend instead append 
       mModels.add(previousIndex, model); 
       mKeys.add(previousIndex, key); 

      } 
     } 
... 
+1

Это должно быть принято в качестве решения – wiiwilleat

0

Вот простой способ, чтобы инвертировать список FirebaseUI с помощью RecyclerView:

boolean reverseList = true; 
    LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, reverseList); 
    if (reverseList) { 
     manager.setStackFromEnd(true); 
    } 
    mRecyclerView.setLayoutManager(manager);