Far*_*nov 26 sorting android firebase firebase-realtime-database
我将数据存储在Firebase存储中.
Comment具有属性的对象timestamp.当我将数据从设备推送到Firebase时,我timestamp使用currentTime 填充并存储在long数据类型中.
当我检索数据时,firebaseRef.orderByChild("timestamp").limitToLast(15)结果不是按照我的预期排序.
我甚至玩过规则而没有结果:
{
"rules": {
".read": true,
".write": true,
".indexOn": "streetrate",
"streetrate": {
".indexOn": ".value"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图储存timestamp在String数据类型,同样的问题.
Fra*_*len 57
Firebase可以按给定属性按升序对项目进行排序,然后返回前N个项目(limitToFirst())或最后N个项目(limitToLast()).没有办法表明您希望项目按降序排列.
有两种方法可以获得您想要的行为:
使用Firebase查询获取正确的数据,然后在客户端重新排序
添加具有降序值的字段到数据
对于后一种方法,通常具有反转时间戳.
-1 * new Date().getTime();
Run Code Online (Sandbox Code Playgroud)
RBK*_*RBK 18
如果您使用Recycler视图呈现该数据,我会发现一个很好的解决方案......
mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
// And set it to RecyclerView
mRecyclerView.setLayoutManager(mLayoutManager);
Run Code Online (Sandbox Code Playgroud)
它将反转数据呈现...
private static class ChatMessageViewHolder extends RecyclerView.ViewHolder {
TextView messageText;
TextView nameText;
public ChatMessageViewHolder(View itemView) {
super(itemView);
nameText = (TextView)itemView.findViewById(android.R.id.text1);
messageText = (TextView) itemView.findViewById(android.R.id.text2);
}
}
FirebaseRecyclerViewAdapter<ChatMessage, ChatMessageViewHolder> adapter;
ref = new Firebase("https://<yourapp>.firebaseio.com");
RecyclerView recycler = (RecyclerView)
findViewById(R.id.messages_recycler);
recycler.setHasFixedSize(true);
//////////////////////////////////////////////////////////
mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
recycler.setLayoutManager(mLayoutManager);
/////////////////////////////////////////////////////////
adapter = new FirebaseRecyclerViewAdapter<ChatMessage, ChatMessageViewHolder>(ChatMessage.class, android.R.layout.two_line_list_item, ChatMessageViewHolder.class, mRef) {
public void populateViewHolder(ChatMessageViewHolder chatMessageViewHolder, ChatMessage chatMessage) {
chatMessageViewHolder.nameText.setText(chatMessage.getName());
chatMessageViewHolder.messageText.setText(chatMessage.getMessage());
}
};
recycler.setAdapter(mAdapter);
Run Code Online (Sandbox Code Playgroud)
Him*_*wat 15
我没有看到任何反转数据的选项.但One Brute的方法是获取数据.
List<ModelClass> mList=new ArrayList();
public void onDataChange(DataSnapshot dataSnapshot)
{
mList.clear();
for(DataSnapshot children: dataSnapshot.getChildren()){
ModelClass modelClass=children.getValue(ModelClass.class);
mList.add(modelClass);
}
Collections.reverse(mList);
Adapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
我通过扩展FirebaseListAdapter并覆盖getItem方法解决了问题:
public abstract class ReverseFirebaseListAdapter<T> extends FirebaseListAdapter<T> {
public ReverseFirebaseListAdapter(Activity activity, Class<T> modelClass, int modelLayout, Query ref) {
super(activity, modelClass, modelLayout, ref);
}
public ReverseFirebaseListAdapter(Activity activity, Class<T> modelClass, int modelLayout, DatabaseReference ref) {
super(activity, modelClass, modelLayout, ref);
}
@Override
public T getItem(int position) {
return super.getItem(getCount() - (position + 1));
}
Run Code Online (Sandbox Code Playgroud)
}
@Monet_z_Polski 方法,基于
@Override
public T getItem(int position) {
return super.getItem(getCount() - (position + 1));
}
Run Code Online (Sandbox Code Playgroud)
不自动更新 FirebaseRecyclerView 确实有一个奇怪的效果(PopulateViewHolder 不会在实时更改中触发)。因此,最好的选择是使用负键来索引数据。
| 归档时间: |
|
| 查看次数: |
24228 次 |
| 最近记录: |