2016-07-28 68 views
0

嗨大衛和Firebase團隊, 我想通過最新的「偵察兵」排序在FragmentStatePagerAdapter中的選項卡。將項目插入FragmentStatePagerAdapter並使其正常刷新似乎非常困難。因此,如果Firebase只是按降序而不是升序(最近的第一個)向我提供密鑰,那麼與其做這件事,不如讓我的生活更輕鬆。如果這是不可能的,請考慮這是orderByKeyDescending()的功能請求:)任何幫助,將不勝感激!謝謝!如何使用orderByKey()以降序而不是升序#Askfirebase

這是我所希望的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()); 
      } 
     }); 

回答

0

巨大的感謝wisemann

TL; DR您無法以Firebase階段降序獲取數據。你必須在客戶端做到這一點。

客戶端對我的解決方案是return POSITION_NONE (-2)getItemPosition。如果你想更高性能,你可以閱讀更多關於標籤在這裏:ViewPager PagerAdapter not updating the View

以下是完整的適配器:

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

而且火力地堡聽衆:

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

火力地堡Query用於排序。

Sort by key

Sort by child

Sort by value

​​

UPDATE

這是不可能的值直接從Fireba降序排序SE。

但是,您可以創建自定義佈局並按相反順序創建視圖。

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

source(They have used a RecyclerView)

+0

呀,但所有這些升序排序的,我怎麼會得到降序排列?謝謝! – SUPERCILEX

0

在列表頂部添加每一個孩子,而不是把它們添加到結束的。

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

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

     ... 
    }); 
+0

我試過了,但由於FragmentStatePagerAdapter使用notifyDataSetChanged()的方式,它不起作用。出於某種原因,它不會刷新已經在內存中的頁面。這意味着所有頁面將具有相同的內容:第1頁加載帶有最舊帖子的內容,第2頁還加載帶有最早帖子的內容,因爲第一個鍵已移動到列表中的第2位,依此類推。 – SUPERCILEX

+1

更改Firebase訂單是不可能的。所以你必須修復尋呼機適配器。此鏈接應該可以幫助你 - > http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view – wisemann

0

我發現了一個有點合理的方式做到這一點,但它不工作時,正常的新項目被添加到數據庫和ViewPager仍處於活動狀態(與其他問題,這不刷新,你會得到重複。請參閱我的評論:How to use orderByKey() in descending order instead of ascending #Askfirebase)。

這裏我有點碎解:

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

而且我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(); 
     } 
    } 
相關問題