2016-07-28 18 views
0

Hallo David und das Firebase-Team, Ich versuche, die Registerkarten in einem FragmentStatePagerAdapter von den letzten "Scout" zu bestellen. Es scheint sehr schwierig zu sein, ein Element in einen FragmentStatePagerAdapter einzufügen und es korrekt zu aktualisieren. Anstatt dies zu tun, würde es mein Leben viel einfacher machen, wenn Firebase mir die Schlüssel in absteigender Reihenfolge geben würde, anstatt aufsteigend (neuste zuerst). Wenn dies nicht möglich ist, betrachten Sie dies als Feature-Anfrage für orderByKeyDescending() :) Jede Hilfe wäre willkommen! Vielen Dank!So verwenden Sie orderByKey() in absteigender Reihenfolge statt aufsteigend #Askfirebase

Hier ist mein Wunsch Zuhörer BTW:

scoutRef.orderByKeyDescending().addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       mSectionsPagerAdapter.mKeyPosition.add(dataSnapshot.getKey()); 
       mSectionsPagerAdapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       FirebaseCrash.report(databaseError.toException()); 
      } 
     }); 

Antwort

0

Vielen Dank an wisemann !!!

TL; DR Mit Firebase können Sie keine Daten in absteigender Reihenfolge abrufen. Sie müssen es auf der Client-Seite tun.

Die Lösung auf der Client-Seite für mich war zu return POSITION_NONE (-2) in getItemPosition. Wenn Sie leistungsfähiger sein möchten, können Sie hier mehr über Tags lesen: ViewPager PagerAdapter not updating the View.

Hier ist der vollständige Adapter:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

    List<String> mKeyPosition = new ArrayList<>(); 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a PlaceholderFragment (defined as a static inner class below). 
     return PlaceholderFragment.newInstance(mKeyPosition.get(position)); 
    } 

    @Override 
    public int getCount() { 
     return mKeyPosition.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return "SCOUT " + (getCount() - position); 
    } 

    public void add(String key) { 
     mKeyPosition.add(0, key); 
     notifyDataSetChanged(); 
    } 
} 

Und der Zuhörer Firebase:

public void updateScouts(final CurrentScoutActivity.SectionsPagerAdapter mSectionsPagerAdapter) { 
    scoutReference.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      mSectionsPagerAdapter.add(dataSnapshot.getKey()); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
      //... 
     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
      //... 
     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
      //... 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      FirebaseCrash.report(databaseError.toException()); 
     } 
    }); 
} 
0

Firebase Query für die Sortierung verwendet wird.

Sort by key

Sort by child

Sort by value

Sort by priority

UPDATE

Es ist nicht möglich, die Werte zu sortieren in absteigender Reihenfolge direkt von Fireba se.

Sie können jedoch ein benutzerdefiniertes Layout erstellen und die Ansicht in umgekehrter Reihenfolge erstellen.

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
layoutManager.setReverseLayout(true); 
layoutManager.setStackFromEnd(true); 

source(They have used a RecyclerView)

+0

Ja, aber all die aufsteigend sortiert, wie würde ich bestellen absteigend? Vielen Dank! – SUPERCILEX

0

jedes Kind an der Spitze der Liste hinzufügen, statt sie zu beenden hinzuzufügen.

scoutRef.orderByKeyDescending().addChildEventListener(new ChildEventListener() { 

     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      mSectionsPagerAdapter.mKeyPosition.add(0, dataSnapshot.getKey()); 
      mSectionsPagerAdapter.notifyDataSetChanged(); 
     } 

     ... 
    }); 
+0

Ich habe das versucht, aber es funktioniert nicht, weil der FragmentStatePagerAdapter notifyDataSetChanged() verwendet. Aus irgendeinem Grund werden die bereits im Speicher befindlichen Seiten nicht aktualisiert. Dies bedeutet, dass alle Seiten den gleichen Inhalt haben: 1. Seite lädt Inhalt mit ältestem Post, 2. Seite lädt auch Inhalt mit ältestem Post, da dieser erste Schlüssel an Position 2 in der Liste verschoben wurde, und so weiter. – SUPERCILEX

+1

Eine Änderung der Firebase-Reihenfolge ist nicht möglich. Sie müssen also den Pager-Adapter reparieren. Dieser Link sollte Ihnen helfen -> http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view – wisemann

0

fand ich eine etwas vernünftige Art und Weise, es zu tun, aber es funktioniert nicht richtig, wenn ein neues Element in die Datenbank hinzugefügt wird und die ViewPager noch aktiv ist (das gleiche wie das andere Problem, es funktioniert nicht Aktualisieren Sie und Sie erhalten Duplikate. Siehe meinen Kommentar: How to use orderByKey() in descending order instead of ascending #Askfirebase).

Hier meine etwas gebrochen Lösung:

final List<String> tmpKeyList = new ArrayList<>(); 
scoutReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       tmpKeyList.clear(); 

       for (DataSnapshot child : dataSnapshot.getChildren()) { 
        if (tmpKeyList.size() < dataSnapshot.getChildrenCount() - 1) { 
         tmpKeyList.add(0, child.getKey()); 
        } else { 
         tmpKeyList.add(0, child.getKey()); 
         mSectionsPagerAdapter.setKeyPositionList(tmpKeyList); 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       FirebaseCrash.report(databaseError.toException()); 
      } 
     }); 

Und mein FragmentStatePagerAdapter:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

     List<String> mKeyPosition = new ArrayList<>(); 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a PlaceholderFragment (defined as a static inner class below). 
      return PlaceholderFragment.newInstance(mKeyPosition.get(position)); 
     } 

     @Override 
     public int getCount() { 
      return mKeyPosition.size(); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return "SCOUT " + (getCount() - position); 
     } 

     public void setKeyPositionList(List<String> list) { 
      mKeyPosition = new ArrayList<>(list); 
      notifyDataSetChanged(); 
     } 
    } 
Verwandte Themen