2016-05-23 21 views
5

Al momento ho un FirebaseListAdapter che popola un ListView con gli ultimi 5 articoli:Android - FirebaseListAdapter in ordine inverso?

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

} 

Il problema che ho è che quando un nuovo elemento è spinto a Firebase, viene aggiunto in fondo alla lista. Voglio gli elementi più recenti in cima alla lista.

È possibile raggiungere questo obiettivo?

Qualsiasi aiuto è molto apprezzato, grazie!

+0

Perché dovresti preoccuparti di utilizzare l'adattatore Firebase in primo luogo? Ho appena dato un'occhiata a Firebase Adapter ed è solo un semplice adattatore che si estende da BaseAdapter. Ti consiglio vivamente di creare il tuo adattatore se hai bisogno di personalizzare le cose. – abeikverdi

+0

Bene, sono molto nuovo a Firebase e non ho esperienza eccessiva in Java per lo sviluppo di Android. Ho visto che FirebaseListAdapter era veloce e facile da implementare, quindi inizialmente ho deciso che sarebbe stata una buona idea usarlo. –

+2

@abeikverdi gli adattatori in FirebaseUI nascondono una certa complessità dietro un codice abbastanza piccolo. In base a quale esperienza consiglieresti di scrivere da solo? –

risposta

11

Questa non è la soluzione esatta del problema relativo al recupero dei dati da Firebase in ordine inverso, ma in ogni caso, abbiamo altri problemi.

Il primo intervento è menzionato in un commento sull'utilizzo di un adattatore personalizzato per l'elenco.

Per ottenere il comportamento è necessario ottenere i dati di Firebase in un elenco e quindi è necessario eseguirne il reverse prima di passarlo a un adattatore. Semplice!

Il secondo intervento è facile come torta e penso che se si utilizza RecyclerView potrebbe fare il trucco per te e lo vedo come il modo più semplice per eseguire il lavoro.

Ecco sto modificando alcuni dei miei codice con 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); 
} 

Impostando mLayoutManager.setReverseLayout(true); - si sta invertendo il layout e mLayoutManager.setStackFromEnd(true); posizioni la vista verso l'alto della tua lista.

La migrazione a RecyclerView è semplice. Il layout sarà qualcosa di simile

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

E nel tuo build.gradle

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

È necessario avere FirebaseRecyclerAdapter può essere trovato qui in FirebaseUI biblioteca.

Nota: Non usare RecyclerView.LayoutManager come setReverseLayout e setStackFromEnd funzioni non saranno trovati in RecyclerView.LayoutManager. Utilizzare LinearLayoutManager come indicato.

Aggiornamento

Ecco come è possibile gestire gli eventi click del elementi nell'elenco.

Si è dovuto dichiarare un ViewHolder per implementare il RecyclerView giusto? Basta aggiungere un'altra funzione all'interno della classe ViewHolder come nell'esempio seguente e chiamare questa funzione dopo le funzioni setText che hai ricevuto.

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

Sto riscontrando alcuni problemi con RecyclerView. Sto indovinando dove hai usato il mio codice originale, il listView è il RecyclerView? Quando faccio setAdapter (adattatore) su recyclerView, non funziona: set adapter (android.support.v7.widget.recyclerview.adapter) non può essere applicato a (com.firebase.ui..FirebaseListAdapter ) –

+0

Sì il tuo 'listView' è' RecyclerView', hai indovinato giusto. E scusa ho fatto un altro piccolo errore. Si prega di vedere questa risposta da @FrankVanPuffelen http://stackoverflow.com/a/31122788/3145960 per vedere come usare 'FirebaseRecyclerAdapter' per lavorare con' RecyclerView'. Sto modificando la risposta. –

+1

Questo sembra funzionare, come in, aggiunge il più recente al top. Sono ancora un po 'bloccato su come rilevare gli eventi di clic sugli elementi nel RecyclerVIew. Sareste in grado di spiegare brevemente come rilevare gli eventi click? Fondamentalmente, ho bisogno di aprire un nuovo frammento quando si fa clic su uno degli elementi. Ho funzionato con ListView. Grazie per l'aiuto. –

3

Dal momento che si sta già estendendo FirebaseListAdapter per implementare populateView, si può andare avanti e ignorare getItem anche per invertire la ricerca oggetto:

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

Se non stai usando RecyclerView questo è un modo semplice per invertire i dati senza estendere altre classi del necessario. Ovviamente questo invertirà qualsiasi sottoclasse AdapterView supportata da questo adattatore, se si sceglie di riutilizzarlo.

+0

Il migliore! Questo è il modo più semplice per fare il lavoro, combinato con orderByChild(). Grazie. – RaySaraiva

+0

funziona come un fascino! –

Problemi correlati