2016-05-23 1 views
5

Ich habe derzeit eine FirebaseListAdapter, die ein Listview mit dem letzten 5 Artikel auffüllt:Android - FirebaseListAdapter in umgekehrter Reihenfolge?

@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); 

} 

Das Problem, das ich habe ist, dass wenn ein neues Element zu Firebase gedrückt wird, um es in den unteren Ende der Liste hinzugefügt wird. Ich möchte die neuesten Artikel an der Spitze der Liste.

Ist es möglich, dies zu erreichen?

Jede Hilfe wird sehr geschätzt, danke!

+0

Warum sollten Sie den Firebase-Adapter zuerst verwenden? Ich habe mir Firebase Adapter angesehen und es ist nur ein einfacher Adapter, der sich von BaseAdapter erstreckt. Ich empfehle Ihnen dringend, Ihren eigenen Adapter zu erstellen, wenn Sie Dinge anpassen müssen. – abeikverdi

+0

Nun, ich bin Firebase sehr neu und auch nicht in Java für Android-Entwicklung übermäßig erfahren. Ich sah, dass der FirebaseListAdapter schnell und einfach zu implementieren war, also entschied ich mich anfangs, dass es eine gute Idee wäre, das zu verwenden. –

+2

@abeikverdi die Adapter in FirebaseUI verstecken ziemlich viel Komplexität hinter ziemlich wenig Code. Basierend auf welcher Erfahrung empfehlen Sie, selbst zu schreiben? –

Antwort

11

Dies ist nicht die genaue Lösung für Ihr Problem, die Daten von Firebase in umgekehrter Reihenfolge zu erhalten, aber wir haben andere Arbeiten um.

Die erste Arbeit wird in einem Kommentar zur Verwendung eines benutzerdefinierten Adapters für Ihre Liste erwähnt.

Um das Verhalten zu erreichen, müssen Sie die Firebase-Daten in einer Liste abrufen und sie dann selbst umkehren, bevor Sie sie an einen Adapter übergeben. Einfach!

Die zweite Arbeit ist einfach wie Kuchen und ich denke, wenn Sie RecyclerView verwenden, könnte es den Trick für Sie tun, und ich sehe es als die einfachste Möglichkeit, die Sie erledigen können.

Ist hier bin ich einige meiner Code mit RecyclerView

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

Modifizieren ...

@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); 
} 

von mLayoutManager.setReverseLayout(true); Einstellung - Sie Umkehren Ihr Layout und mLayoutManager.setStackFromEnd(true); Positionen der Blick nach oben deiner Liste.

Migration zu RecyclerView ist einfach. Ihr Layout wird so etwas wie dieses

<?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> 

Und in Ihrem build.gradle

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

Sie müssen haben FirebaseRecyclerAdapter hier in FirebaseUI Bibliothek gefunden werden kann.

Hinweis: nicht RecyclerView.LayoutManager wie die setReverseLayout und setStackFromEnd Funktionen werden nicht in RecyclerView.LayoutManager gefunden anwenden. Verwenden Sie LinearLayoutManager wie angegeben.

aktualisieren

Hier ist, wie Sie die Click-Ereignisse Ihrer Artikel in der Liste verarbeiten kann.

Sie mussten eine ViewHolder deklarieren, um die RecyclerView richtig zu implementieren? Fügen Sie einfach eine weitere Funktion in Ihre ViewHolder Klasse wie im folgenden Beispiel ein und rufen Sie diese Funktion nach den setText Funktionen auf, die Sie dort haben.

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

Ich habe einige Probleme mit dem RecyclerView. Ich vermute, wo Sie meinen ursprünglichen Code verwendet haben, ist das ListView der RecyclerView? Wenn ichAdapter (Adapter) in der RecyclerView-Datei setze, funktioniert es nicht: set adapter (android.support.v7.widget.recyclerview.adapter) kann nicht angewendet werden (com.firebase.ui..FirebaseListAdapter ) –

+0

Ja, dein 'listView' ist' RecyclerView', du hast es richtig vermutet. Und tut mir leid, ich habe einen weiteren kleinen Fehler gemacht. Bitte lesen Sie diese Antwort von @FrankVanPuffelen http://StackOverflow.com/a/31122788/3145960, um zu sehen, wie 'FirebaseRecyclerAdapter' verwendet wird, um mit' RecyclerView' zu arbeiten. Ich bearbeite die Antwort. –

+1

Dies scheint zu funktionieren, wie in, es fügt das Neueste an die Spitze. Ich bin immer noch ein bisschen fest, wie man Klickereignisse auf den Artikeln im RecyclerViewer erkennt. Können Sie kurz erklären, wie Klickereignisse erkannt werden? Grundsätzlich muss ich ein neues Fragment öffnen, wenn auf eines der Elemente geklickt wird. Ich hatte es mit ListView arbeiten. Danke für die Hilfe. –

3

Da Sie bereits FirebaseListAdapter erstreckt populateView zu implementieren, können Sie voran gehen und außer Kraft setzen getItem als auch das Element Nachschlag zu invertieren:

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

Wenn Sie nicht RecyclerView mit diesem ist ein einfache Möglichkeit, die Daten umzukehren, ohne weitere Klassen als nötig zu erweitern. Offensichtlich wird dies jede AdapterView Unterklasse, die von diesem Adapter unterstützt wird, rückgängig machen, wenn Sie sie wiederverwenden.

+0

Beste! Dies ist die einfachste Möglichkeit, den Job zusammen mit orderByChild() auszuführen. Vielen Dank. – RaySaraiva

+0

das funktioniert wie ein Charme! –