java - FirebaseUI RecycleView 搜索不起作用
问题描述
这是我的SearchGetterSetter.java代码:
package com.me.Admin;
public class SearchGetterSetter {
String fname;
public SearchGetterSetter(String fname) {
this.fname = fname;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
}
这是我的 SearchUserActivity.java 代码
package com.me.Admin;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.FirebaseException;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.infoters.killansfitnessstudio.R;
public class SearchUserActivity extends AppCompatActivity {
private EditText SearchTxt;
private ImageButton SearchBtn;
private RecyclerView SearchRV;
private DatabaseReference mUserDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_user);
mUserDatabase = FirebaseDatabase.getInstance().getReference("users");
SearchTxt = findViewById(R.id.SearchUserTxt);
SearchBtn = findViewById(R.id.SearchUserBtn);
SearchRV = findViewById(R.id.SearchUserRV);
SearchRV.setHasFixedSize(true);
SearchRV.setLayoutManager(new LinearLayoutManager(this));
SearchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String searchText = SearchTxt.getText().toString();
firebaseUserSearch(searchText);
}
});
}
private void firebaseUserSearch(String searchText) {
Query firebaseSearchQuery = mUserDatabase.child("fname");
FirebaseRecyclerOptions<SearchGetterSetter> response = new
FirebaseRecyclerOptions.
Builder<SearchGetterSetter>
().setQuery(firebaseSearchQuery,SearchGetterSetter.class).build();
FirebaseRecyclerAdapter<SearchGetterSetter,UserViewHolder> Fire = new
FirebaseRecyclerAdapter<SearchGetterSetter, UserViewHolder>(response){
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup
viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.search_user_item, viewGroup, false);
return new UserViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull UserViewHolder holder, int
position, @NonNull SearchGetterSetter model) {
holder.fName.setText(model.getFname());
}
};
Fire.notifyDataSetChanged();
SearchRV.setAdapter(Fire);
}
public class UserViewHolder extends RecyclerView.ViewHolder{
private TextView fName;
public UserViewHolder(@NonNull View itemView) {
super(itemView);
fName = itemView.findViewById(R.id.SUTxt);
}
}
}
我想从 Firebase 实时数据库中搜索 fname。在搜索按钮上按下我正在调用firebaseUserSearch()
方法。
我尝试了几种方法,但对我没有任何作用。我猜我做错了 FirebaseRecycleViewAdapter。我提到了这个。我哪里出错了?
编辑:
更新代码:
public class SearchUserActivity extends AppCompatActivity {
private EditText SearchTxt;
private ImageButton SearchBtn;
private RecyclerView SearchRV;
private DatabaseReference mUserDatabase;
private FirebaseRecyclerAdapter<SearchGetterSetter,UserViewHolder> Fire;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_user);
mUserDatabase = FirebaseDatabase.getInstance().getReference("users");
SearchTxt = findViewById(R.id.SearchUserTxt);
SearchBtn = findViewById(R.id.SearchUserBtn);
SearchRV = findViewById(R.id.SearchUserRV);
// SearchRV.setHasFixedSize(true);
SearchRV.setLayoutManager(new LinearLayoutManager(this));
SearchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String searchText = SearchTxt.getText().toString();
firebaseUserSearch(searchText);
Toast.makeText(SearchUserActivity.this, "Clicked",
Toast.LENGTH_SHORT).show();
}
});
}
private void firebaseUserSearch(String searchText) {
Query firebaseSearchQuery = mUserDatabase.orderByChild("fname").startAt(searchText).endAt(searchText + "\uf8ff");
FirebaseRecyclerOptions<SearchGetterSetter> response = new FirebaseRecyclerOptions.
Builder<SearchGetterSetter>().setQuery(firebaseSearchQuery,SearchGetterSetter.class).build();
Fire = new FirebaseRecyclerAdapter<SearchGetterSetter, UserViewHolder>(response){
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.search_user_item, viewGroup, false);
return new UserViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull UserViewHolder holder,
int position, @NonNull SearchGetterSetter model) {
holder.fname.setText(model.getFname());
}
};
Fire.startListening();
Fire.notifyDataSetChanged();
SearchRV.setAdapter(Fire);
}
public static class UserViewHolder extends RecyclerView.ViewHolder{
private TextView fname;
public UserViewHolder(@NonNull View itemView) {
super(itemView);
fname = (TextView) itemView.findViewById(R.id.SUTxt);
}
}
}
解决方案
你的这个声明:
Query firebaseSearchQuery = mUserDatabase.child("fname");
应该
Query firebaseSearchQuery = mUserDatabase.orderByChild("fname").equals(searchText);
正如我看到您的代码,您没有在查询中使用searchText变量。
推荐阅读
- excel - 使用 =NETWORKDAYS() 时出现不合理的大负数
- angularjs - 在两台服务器中启用 cors 过滤器
- c - C 宏在另一个 C 宏中展开
- php - 如何从数据库中删除多条记录(使用 laravel 5.5)
- twitter-bootstrap - bootstrap 4 折叠 data-parent dosent 关闭其他选项卡
- vba - 宏“另存为”并且不打开保存的文档
- fiware - 验证令牌时出错。代理未在 keystone 中授权。梯形验证
- c - string.h 和 stdlib.h 函数给了我错误: undefined reference to '...'
- c - 计数器值小于访问次数的网页计数器
- ffmpeg - ffplay可以看字幕吗