Java 按编辑文本筛选结果
在我的Java 按编辑文本筛选结果,java,android,firebase-realtime-database,Java,Android,Firebase Realtime Database,在我的ExploreFragment.java中,我有一个EditText,它基本上允许用户搜索存储在我的Firebase实时数据库中的国家名称。 我想实现的是,当用户在编辑文本中键入内容,然后在键盘上按“提交”键时,它会生成一个查询,检索每个在其名称中键入字符串的国家,并重定向到我的片段FilteredResultsFragment.java,其中显示检索到的国家的名称。我的片段有一个带有适配器的回收器视图。 我还没有做到这一点。我需要检索一个带有URL的列表和一个带有名称的列表。 查询应如下
ExploreFragment.java
中,我有一个EditText,它基本上允许用户搜索存储在我的Firebase实时数据库中的国家名称。
我想实现的是,当用户在编辑文本中键入内容,然后在键盘上按“提交”键时,它会生成一个查询,检索每个在其名称中键入字符串的国家,并重定向到我的片段FilteredResultsFragment.java
,其中显示检索到的国家的名称。我的片段有一个带有适配器的回收器视图。
我还没有做到这一点。我需要检索一个带有URL的列表和一个带有名称的列表。
查询应如下所示:
FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
Log.d("TAMANHO","size = "+paisEscolhido.size());
for (int i = 0; i<paisEscolhido.size(); i++) {
Log.d("CONTINETNE","size = "+paisEscolhido.get(i));
DatabaseReference paisNomeContinentes = mDatabase.getReference().child("paises");
Query queries = paisNomeContinentes.orderByChild("Continente").equalTo(paisEscolhido.get(i));
queries.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
List<String> imagemPaisList = new ArrayList<>();
List<String> nomePaisList = new ArrayList<>();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String imagemPais = ds.child("Imagem").getValue(String.class);
String nomePais = ds.child("Nome").getValue(String.class);
imagemPaisList.add(imagemPais);
nomePaisList.add(nomePais);
}
int urlCount = imagemPaisList.size();
// int randomImage = new Random().nextInt(urlCount);
for (int i = 0; i < nomePaisList.size(); i++) {
Integer randomVariavel = new Random().nextInt(urlCount);
randomImagemPaisList.add(imagemPaisList.get(randomVariavel));
randomNomePaisList.add(nomePaisList.get(randomVariavel));
}
FirebaseDatabase mDatabase=FirebaseDatabase.getInstance();
Log.d(“TAMANHO”,“size=“+paisescolido.size());
对于(int i=0;i如果要使用startAt()
过滤数据,还必须使用endAt()
,因为startAt()
是查询的起点,而不是过滤器。通过在endAt(
)中的搜索字符串后面添加\uf8ff
(最后一个unicode字符)您将查询限制为仅获取以searchstring开头的值:
Query queries = paisNomeContinentes.orderByChild("Nome").startAt("Po").endAt("Po" + "\uf8ff");
请记住,这将只获取以搜索字符串开头的项目,而不获取包含搜索字符串的项目。如果要使用startAt()
过滤数据,还必须使用endAt()
,因为startAt()
用作查询的起点,而不是筛选器。通过在endAt(
)中的搜索字符串后面添加\uf8ff
(最后一个unicode字符),可以将查询限制为仅获取以搜索字符串开头的值:
Query queries = paisNomeContinentes.orderByChild("Nome").startAt("Po").endAt("Po" + "\uf8ff");
请记住,这将只获取以searchstring开头的项目,而不是包含searchstring的项目。Firebase无法查询包含值的字符串。它只能查询以该值开头的字符串。这是否解释了您在运行此代码时看到的情况o如果我保存一个值为EditText的变量,然后像这样查询它,但将“equalTo”更改为“startWith(variable)”,我将获得所有以这些字符开头的国家/地区?@FrankvanPuffelen,请参阅我的更新问题:)您可以在firebase适配器中按“x”进行筛选。只要隐藏你不想显示的项目视图,请简化你的代码,因为现在有太多的事情要做。1) 删除对视图的所有操作,2)删除所有列表,3)对搜索字符串使用硬编码值,4)使用简单日志语句写入与预期不同的值,5)显示查询的数据结构,6)显示日志语句的输出。这样就可以在十几行左右的行中重现问题。Firebase无法查询包含值的字符串。它只能查询以该值开头的字符串。这能解释你运行代码时看到的情况吗?嗯,如果我保存一个值为EditText的变量,然后像这样查询它,但将“equalTo”改为“startWith(variable)”,我会得到所有以这些字符开头的国家/地区?@frankvanpoffelen,请参阅我的更新问题:)您可以通过firebase适配器中的“x”进行筛选。只要隐藏你不想显示的项目视图,请简化你的代码,因为现在有太多的事情要做。1) 删除对视图的所有操作,2)删除所有列表,3)对搜索字符串使用硬编码值,4)使用简单日志语句写入与预期不同的值,5)显示查询的数据结构,6)显示日志语句的输出。这样的话,应该可以用十几行来重现这个问题。伙计,很抱歉再次打扰你,但是,我怎么才能让第一个字母总是大写呢?我的意思是,当用户键入“portu”时,与他键入“portu”时不同ahaha@AndréSilva Mate,很抱歉再次打扰你,但是,我如何才能让第一个字母始终保持较高?我的意思是,当用户键入“portu”时,与他键入“portu”时不同ahaha@Andr塞席尔瓦