Android - FirebaseListAdapter 的顺序相反吗?
Android - FirebaseListAdapter in reverse order?
我目前有一个 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
它可以为您解决问题,我认为这是完成这项工作的最简单方法。
这是我正在用 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'
}
您需要 FirebaseRecyclerAdapter
可以在 FirebaseUI 库中找到。
注意: 不要使用 RecyclerView.LayoutManager
因为 setReverseLayout
和 setStackFromEnd
函数不会在 RecyclerView.LayoutManager
中找到.按照说明使用 LinearLayoutManager
。
更新
以下是处理列表中项目的点击事件的方法。
您必须声明一个 ViewHolder
才能实现 RecyclerView
对吗?只需像下面的示例一样在 ViewHolder
class 中添加另一个函数,并在您到达那里的 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)...
}
}
由于您已经扩展了 FirebaseListAdapter
以实现 populateView
,您可以继续覆盖 getItem
以及反转项目查找:
@Override
public HashMap getItem(int pos) {
return super.getItem(getCount() - 1 - pos);
}
如果您不使用 RecyclerView
,这是一种反转 数据 的简单方法,无需扩展任何不必要的 类。显然,如果您选择重用它,这将反转此适配器支持的任何 AdapterView
子类。
我目前有一个 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
它可以为您解决问题,我认为这是完成这项工作的最简单方法。
这是我正在用 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'
}
您需要 FirebaseRecyclerAdapter
可以在 FirebaseUI 库中找到。
注意: 不要使用 RecyclerView.LayoutManager
因为 setReverseLayout
和 setStackFromEnd
函数不会在 RecyclerView.LayoutManager
中找到.按照说明使用 LinearLayoutManager
。
更新
以下是处理列表中项目的点击事件的方法。
您必须声明一个 ViewHolder
才能实现 RecyclerView
对吗?只需像下面的示例一样在 ViewHolder
class 中添加另一个函数,并在您到达那里的 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)...
}
}
由于您已经扩展了 FirebaseListAdapter
以实现 populateView
,您可以继续覆盖 getItem
以及反转项目查找:
@Override
public HashMap getItem(int pos) {
return super.getItem(getCount() - 1 - pos);
}
如果您不使用 RecyclerView
,这是一种反转 数据 的简单方法,无需扩展任何不必要的 类。显然,如果您选择重用它,这将反转此适配器支持的任何 AdapterView
子类。