Ale*_*llé 7 java 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);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当一个新项目被推送到Firebase时,它会被添加到列表的底部.我想要列表顶部的最新项目.
是否有可能实现这一目标?
非常感谢任何帮助,谢谢!
Rea*_*hed 14
这不是你以相反的顺序从firebase获取数据的问题的确切解决方案,但无论如何,我们还有其他的解决方法.
在为列表使用自定义适配器的注释中提到了第一个解决方法.
要实现您需要将firebase数据放入列表中然后在将其传递给适配器之前自行撤消的行为.简单!
第二种方法很容易就像馅饼一样,我认为如果你正在使用RecyclerView它可以为你做到这一点,我认为这是你做这项工作最简单的方法.
这是我正在修改我的一些代码 RecyclerView
// Declare the RecyclerView and the LinearLayoutManager first
private RecyclerView listView;
private LinearLayoutManager mLayoutManager;
Run Code Online (Sandbox Code Playgroud)
...
@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);
}
Run Code Online (Sandbox Code Playgroud)
通过设置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>
Run Code Online (Sandbox Code Playgroud)
在你的 build.gradle
dependencies {
compile 'com.android.support:recyclerview-v7:23.4.0'
}
Run Code Online (Sandbox Code Playgroud)
你需要FirebaseRecyclerAdapter在FirebaseUI库中找到它.
注意:不要使用RecyclerView.LayoutManager作为setReverseLayout和setStackFromEnd功能不会被发现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)...
}
}
Run Code Online (Sandbox Code Playgroud)
由于您已经扩展FirebaseListAdapter了实现populateView,因此您可以继续进行覆盖并进行覆盖getItem以反转项目查找:
@Override
public HashMap getItem(int pos) {
return super.getItem(getCount() - 1 - pos);
}
Run Code Online (Sandbox Code Playgroud)
如果您不使用它,那么RecyclerView这是一种简单的方法,可以在不扩展不必要的任何类的情况下反转数据。显然AdapterView,如果您选择重用它,它将逆转此适配器支持的任何子类。
| 归档时间: |
|
| 查看次数: |
5016 次 |
| 最近记录: |