Android Firestore 过滤器回收视图

Posted

技术标签:

【中文标题】Android Firestore 过滤器回收视图【英文标题】:Android Firestore filter recyclerview 【发布时间】:2021-06-09 15:06:12 【问题描述】:

我在 android Studio(Java) 中开发了一个“租车”Android 应用程序,我想为其添加一个新功能。我想添加到主页,其中显示所有可用汽车的按钮,该按钮打开一个新活动,用户可以在其中按多个标准过滤要向他显示的汽车(来自回收站视图)。例如:他可以选择燃料类型、座位数、牵引类型等。

我的问题是:如何将数据从 FilterCars 活动(用户过滤汽车)传递到 HomeFragment(显示所有汽车)?我是否需要自定义 RecyclerView 构建器才能处理复合查询?

编辑:假设我使用意图包将过滤器从 FilterCars.class 传递到 HomeFragment.class。但是如何在 HomeFragment 中应用这些过滤器呢?

现在 FragmentCars.class 是空的,因为我不知道如何将过滤器传递给 HomeFragment 以及如何在那里处理它们。这是 HomeFragment.class 代码(显示所有汽车):

public class HomeFragment extends Fragment 

private RecyclerView recyclerView;
carAdapter adapter; // Create Object of the Adapter class
ImageButton btnSort;
private static ProgressBar progressBar;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 

    View view = inflater.inflate(R.layout.fragment_home,container,false);
    Query query = FirebaseFirestore.getInstance().collection("Cars").orderBy("carName");
    progressBar = (ProgressBar)view.findViewById(R.id.progressBarHome);
    btnSort = (ImageButton) view.findViewById(R.id.btnSort);
    recyclerView = view.findViewById(R.id.recycler1);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    FirestoreRecyclerOptions<car> options = new FirestoreRecyclerOptions.Builder<car>()
            .setQuery(query, car.class)
            .build();

    btnSort.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            startActivity(new Intent(getContext(), FilterCars.class));  // Here we open the activity which contains all the filters
        
    );

    adapter = new carAdapter(options);
    recyclerView.setAdapter(adapter);
    return view;




public static void disableProgressBar() 
    progressBar.setVisibility(View.GONE);


@Override public void onStart()

    super.onStart();
    adapter.startListening();



// Function to tell the app to stop getting
// data from database on stoping of the activity
@Override public void onStop()

    super.onStop();
    adapter.stopListening();


【问题讨论】:

【参考方案1】:

请阅读:https://developer.android.com/guide/fragments/communicate 它应该可以帮助你。

如果您真的想将过滤器作为一个 Activity,您还可以了解 startActivityForResult()。退房 : https://developer.android.com/training/basics/intents/result

我不知道你到底想怎么做,因为我对你的应用架构和需求了解不多。无论如何,我希望这些链接能给你带来你正在寻找的机会。

【讨论】:

我了解如何在活动之间传递数据,我主要关心的是如何获取所有这些过滤器,将它们组合成一个查询,然后根据用户选择将这些查询应用到 FirestoreRecyclerOptions 构建器。以及如何设计它,以便用户可以将一些过滤器留空并且查询仍然有效(例如:如果他选择燃料:柴油,座位:5 但在牵引力时他不想过滤(或将其保留为默认值,如牵引力) : all or something like that). 我说清楚了吗? 看这里:github.com/firebase/FirebaseUI-Android/blob/master/database/src/… 只需使用 updateOptions。我无法帮助您构建查询,因为您没有包含有关表格外观的任何信息。关键是要有一个distiory 或map 。比制作​​一个方法,它将从地图中构造查询。 换句话说——你的车里有什么样的节点? 好的.. 我有一个名为“汽车”的集合,其中包含许多具有随机生成 ID 的文档。每个文档代表一辆汽车,并包含以下属性:汽车名称、燃料、座椅、齿轮箱、牵引力等。如果我在 FilterCars.class 中过滤它们并将它们传递给显示所有汽车的 HomeFragment,我该如何进行复合查询和然后将查询传递给 FirestoreRecyclerOptions?例如,用户在 FilterCars 中选择以下内容:燃料:“Diesel”,牵引力:“AWD”和座位:5。然后我将这些信息传递给 HomeFragment,在那里我应该使用这 3 个条件进行查询。 我的建议是将您的过滤器发送到 Activity 并使用该过滤器获取您的数据(在该 Activity 创建复合查询并在 onStart 方法中使用 SnapshotListener)。

以上是关于Android Firestore 过滤器回收视图的主要内容,如果未能解决你的问题,请参考以下文章

Recycler View Android中的Firestore数据[重复]

Firestore如何在回收站视图中从firestore检索数据

将我的应用程序发布到 google playstore 后,我的应用程序无法获取 firestore 数据以回收分页视图

Firestore回收器适配器无法获取文档名称

我们可以在不重新设置整个适配器的情况下更新 Firestore 回收器适配器的查询吗?

回收站视图滚动到特定位置