2016-05-23 12 views
5

Obecnie mam FirebaseListAdapter że zapełnia ListView z ostatnich 5 elementów:Android - FirebaseListAdapter w odwrotnej kolejności?

@Override 
public void onViewCreated(View view, Bundle savedInstanceState){ 

    FirebaseListAdapter<HashMap> adapter = new FirebaseListAdapter<HashMap>(getParentFragment().getActivity(),HashMap.class,R.layout.list_item,firebase.limitToLast(5)) { 
     @Override 
     protected void populateView(View view, HashMap hashMap, int i) { 
      String title = hashMap.get("title").toString(); 
      String body = hashMap.get("body").toString(); 

      TextView title_txt = (TextView)view.findViewById(R.id.title); 
      TextView body_txt = (TextView)view.findViewById(R.id.body); 

      title_txt.setText(title); 
      body_txt.setText(body); 
     } 
    }; 

    listView.setAdapter(adapter); 

} 

Mam problem jest to, że gdy nowy element jest popychany do Firebase, jest on dodawany do dołu listy. Chcę najnowsze pozycje na górze listy.

Czy można to osiągnąć?

Każda pomoc jest bardzo doceniana, dzięki!

+0

Po co w ogóle korzystać z adaptera Firebase? Właśnie rzuciłem okiem na Firebase Adapter i jego prostą kartę, która rozciąga się od BaseAdaptera. Zdecydowanie zaleca się utworzenie własnego adaptera, jeśli chcesz dostosować ustawienia. – abeikverdi

+0

Cóż, jestem bardzo początkujący w Firebase, a także niezbyt doświadczony w Javie dla rozwoju Androida. Widziałem, że FirebaseListAdapter był szybki i łatwy w implementacji, więc początkowo zdecydowałem, że warto go użyć. –

+2

@abeikverdi Adaptery w FirebaseUI kryją dość złożoność za dość małym kodem. W oparciu o to, czego doś wiadczeń zalecamy napisanie własnego? –

Odpowiedz

11

To nie jest dokładne rozwiązanie problemu pobierania danych z firebase w odwrotnej kolejności, ale w każdym razie mamy inne prace do wykonania.

Pierwsza praca jest wymieniona w komentarzu dotyczącym używania niestandardowego adaptera do listy.

Aby uzyskać takie zachowanie, należy uzyskać dane z bazy danych na liście, a następnie należy odwrócić je samodzielnie przed przekazaniem do adaptera. Prosty!

Druga praca jest łatwa jak ciasto i myślę, że jeśli używasz RecyclerView, to może ci to pomóc i uważam to za najprostszy sposób na wykonanie tej pracy.

Tutaj to ja modyfikując niektóre z moich kodu z RecyclerView

// Declare the RecyclerView and the LinearLayoutManager first 
private RecyclerView listView; 
private LinearLayoutManager mLayoutManager; 

...

@Override 
public void onViewCreated(View view, Bundle savedInstanceState){ 

    // Use FirebaseRecyclerAdapter here 

    // Here you modify your LinearLayoutManager 
    mLayoutManager = new LinearLayoutManager(MainActivity.this); 
    mLayoutManager.setReverseLayout(true); 
    mLayoutManager.setStackFromEnd(true); 

    // Now set the layout manager and the adapter to the RecyclerView 
    listView.setLayoutManager(mLayoutManager); 
    listView.setAdapter(adapter); 
} 

Ustawiając mLayoutManager.setReverseLayout(true); - jesteś cofania układ i mLayoutManager.setStackFromEnd(true); pozycji widoku na górę twojej listy.

Migracja do RecyclerView jest prosta. Twój układ będzie coś takiego

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/my_list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

iw swoim build.gradle

dependencies { 
    compile 'com.android.support:recyclerview-v7:23.4.0' 
} 

Trzeba mieć FirebaseRecyclerAdapter można tu znaleźć w FirebaseUI bibliotece.

Uwaga: Nie używaj RecyclerView.LayoutManager jako funkcji setReverseLayout i setStackFromEnd nie będzie można znaleźć w RecyclerView.LayoutManager. Użyj podanego LinearLayoutManager.

Aktualizacja

Oto jak można obsługiwać zdarzenia kliknięcia pozycji na liście.

Musisz zadeklarować ViewHolder w celu wprowadzenia prawa RecyclerView? Po prostu dodaj inną funkcję wewnątrz klasy ViewHolder, tak jak w poniższym przykładzie i wywołaj tę funkcję po funkcjach setText, które tam masz.

public static class MyViewHolder extends RecyclerView.ViewHolder { 
    View mView; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     mView = itemView; 
    } 

    public void setClickEvent() { 
     // Set the onClickListener on mView 
     // mView.setOnClickListener(new OnClickListener)... 
    } 
} 
+1

Mam pewne problemy z RecyclerView. Zgaduję, gdzie użyłeś mojego oryginalnego kodu, listView to RecyclerView? Kiedy ustawiam setAdapter (adapter) na recyclerView, to nie działa: set adapter (android.support.v7.widget.recyclerview.adapter) nie może być zastosowany do (com.firebase.ui..FirebaseListAdapter ) –

+0

Tak, twoja 'listView' to' RecyclerView', zgadłeś. I przepraszam, że popełniłem kolejny mały błąd. Zobacz tę odpowiedź z @FrankVanPuffelen http://stackoverflow.com/a/31122788/3145960, aby zobaczyć, jak używać 'FirebaseRecyclerAdapter' do pracy z' RecyclerView'. Edytuję odpowiedź. –

+1

Wygląda na to, że działa, ponieważ dodaje najnowsze do góry. Nadal jestem trochę utknął w tym, jak wykrywać zdarzenia kliknięcia na produktach w RecyclerVIew. Czy możesz krótko wyjaśnić, jak wykrywać zdarzenia kliknięcia? Zasadniczo muszę otworzyć nowy fragment po kliknięciu jednego z elementów. Miałem to działa z ListView. Dzięki za pomoc. –

3

Skoro jesteś już rozszerzenie FirebaseListAdapter wdrożyć populateView, można śmiało zastąpić getItem także odwrócić odnośnika artykułu:

@Override 
public HashMap getItem(int pos) { 
    return super.getItem(getCount() - 1 - pos); 
} 

Jeśli nie używasz RecyclerView to prosty sposób odwrócenia wartości bez rozszerzania dodatkowych klas, niż jest to konieczne. Oczywiście to odwróci każdą podklasę AdapterView wspieraną przez ten adapter, jeśli zdecydujesz się go użyć ponownie.

+0

Najlepszy! Jest to prosty sposób wykonania zadania w połączeniu z funkcją orderByChild(). Dzięki. – RaySaraiva

+0

działa to jak urok! –

Powiązane problemy