我目前有一个FirebaseListAdapter,用最后5个项填充ListView:
@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); }
我遇到的问题是,当一个新项目被推送到Firebase时,它会被添加到列表的底部.我想要列表顶部的最新项目.
是否有可能实现这一目标?
非常感谢任何帮助,谢谢!
解决方法
这不是你以相反的顺序从firebase获取数据的问题的确切解决方案,但无论如何,我们还有其他的解决方法.
要实现您需要将firebase数据放入列表中然后在将其传递给适配器之前自行撤消的行为.简单!
第二种方法很容易就像馅饼一样,我想如果你使用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); }
通过设置mLayoutManager.setReverseLayout(true); – 你正在颠倒布局和mLayoutManager.setStackFromEnd(true);将视图定位到列表顶部.
迁移到RecyclerView很简单.你的布局将是这样的
<?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>
在你的build.gradle中
dependencies { compile 'com.android.support:recyclerview-v7:23.4.0' }
您需要在FirebaseUI库中找到FirebaseRecyclerAdapter.
注意:不要使用RecyclerView.LayoutManager作为setReverseLayout,并且在RecyclerView.LayoutManager中找不到setStackFromEnd函数.如上所述使用LinearLayoutManager.
更新
以下是如何处理列表中项目的点击事件.
您必须声明ViewHolder才能实现RecyclerView吗?只需在ViewHolder类中添加另一个函数,如下例所示,并在setText函数之后调用此函数.
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)... } }