我目前有一个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)...
- }
- }