2016-07-28 80 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(); 
     } 
    } 
相关问题