Android - FirebaseListAdapter的顺序是否相反?

时间:2016-05-23 16:38:29

标签: android listview firebase firebase-realtime-database

我目前有一个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时,它会被添加到列表的底部。我想要列表顶部的最新项目。

有可能实现这个目标吗?

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:14)

这不是你以相反的顺序从firebase获取数据的问题的确切解决方案,但无论如何,我们还有其他的解决方法。

在为列表使用自定义适配器的注释中提到了第一个解决方法。

要实现将firebase数据放入列表中所需的行为,然后在将其传递给适配器之前自己进行反转。简单!

第二种解决方法很简单,我认为如果你使用RecyclerView它可以为你做这个技巧,我认为这是你做这项工作最简单的方法。

这是我用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使用setReverseLayoutsetStackFromEnd中找不到RecyclerView.LayoutManager个功能。如上所述使用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)...
    }
}

答案 1 :(得分:5)

由于您已经将FirebaseListAdapter扩展为实施populateView,因此您可以继续覆盖getItem以反转项目查找:

@Override
public HashMap getItem(int pos) {
    return super.getItem(getCount() - 1 - pos);
}

如果你没有使用RecyclerView,这是一种简单的方法来反转数据而不扩展任何超过必要的类。显然,如果您选择重用它,这将反转此适配器支持的任何AdapterView子类。