Автоматический Поиск в recyclerview
Моя программа получает данные из firebase в recyclerview и сортирует их. Это таблица рекордов для игры. Каждый игрок добавляет туда своё имя с результатом. Программа должна запоминать имя игрока, чтобы оно выделялось в таблице(и чтобы обновлять его результат). Хочу сделать автоматический поиск своего элемента по имени без ввода в меню. Попытался добавить поиск по видео с youtube. Сейчас выдаёт пустой экран. Подскажите, что нужно исправить
Вот класс моего адаптера. Добавил в нём поиск по name. Теперь пустой экран
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements Filterable {
Context context;
ArrayList<User> list;
ArrayList<User> listFull;
public MyAdapter(Context context, ArrayList<User> list) {
this.context = context;
this.listFull = list;
this.list = new ArrayList(listFull);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
User user = list.get(position);
holder.number.setText(position+1+"");
holder.name.setText(user.getName().substring(0,user.getName().length()-8));
holder.level.setText(user.getLevel()+"");
holder.average.setText(String.format("%d.%02d", user.getMiddleResult() / 100, (user.getMiddleResult() % 100)));
switch (position){
case 0: holder.itemView.setBackgroundResource(R.drawable.gold_shape);
break;
case 1: holder.itemView.setBackgroundResource(R.drawable.silver_shape);
break;
case 2: holder.itemView.setBackgroundResource(R.drawable.bronse_shape);
break;
default: holder.itemView.setBackgroundResource(R.drawable.white_shape);
break;
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public Filter getFilter() {
return userFilter;
}
private final Filter userFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<User> filteredUserList = new ArrayList<>();
if (constraint==null || constraint.length()==0){
filteredUserList.addAll(listFull);
} else{
String filterPattern = constraint.toString().toLowerCase().trim();
for(User user:listFull){
if (user.name.toLowerCase().contains(filterPattern))
{filteredUserList.add(user);}
}
}
FilterResults results = new FilterResults();
results.values = filteredUserList;
results.count = filteredUserList.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
list.clear();
list.addAll((ArrayList)results.values);
notifyDataSetChanged();
}
};
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView name, level, average, number;
public MyViewHolder(@NonNull View itemView){
super(itemView);
number = itemView.findViewById(R.id.tvNumber);
name = itemView.findViewById(R.id.tvname);
level = itemView.findViewById(R.id.tvlevel);
average = itemView.findViewById(R.id.tvaverage);
}
}
}
Эта форма связана с таблицей recyclerview.
public class userlist extends AppCompatActivity {
RecyclerView recyclerView;
DatabaseReference database;
MyAdapter myAdapter;
ArrayList<User> list, listFull;
private Toast backToast;
FirebaseAuth auth;
FirebaseDatabase db;
Button buttonReg;
TextView textTop, button_close_from_userlist;
public static int alreadyre;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userlist);
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
SharedPreferences save = getSharedPreferences("Save", MODE_PRIVATE);
final int alreadyReg = save.getInt("alreadyReg", 0);
textTop = findViewById(R.id.textTop);
button_close_from_userlist = findViewById(R.id.button_close_from_userlist);
buttonReg = findViewById(R.id.buttonReg);
recyclerView = findViewById(R.id.userList);
database = FirebaseDatabase.getInstance().getReference("users");
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
list = new ArrayList<>();
listFull = new ArrayList<>();
myAdapter = new MyAdapter(this, list);
recyclerView.setAdapter(myAdapter);
auth = FirebaseAuth.getInstance();
db = FirebaseDatabase.getInstance();
database.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
listFull.clear();
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
User user = dataSnapshot.getValue(User.class);
listFull.add(user);
Collections.sort(list, User.levelSort);
}
myAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
myAdapter = new MyAdapter(this, listFull);
recyclerView.setAdapter(myAdapter);
myAdapter.getFilter().filter("qqq");
if (alreadyReg == 1) {
buttonReg.setVisibility(View.INVISIBLE);
}
buttonReg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (alreadyReg == 0 && alreadyre == 0) {
showRegisterWindows(); //доавить в таблице своё имя (используется один раз)
}
myAdapter.notifyDataSetChanged();
}
});
}
Class User
public class User implements Comparable<User> { // Добавили в заголовок implements Comparable<User> для того чтобы можно было испольовать метод сортировки
public String name, pass;
public int level, middleResult, number, key;
public User() {
}
public User(String name, String pass, int level, int middleResult) {
this.name = name;
this.pass = pass;
this.level = level;
this.middleResult = middleResult;
}
public User(String name, int level, int middleResult) {
this.name = name;
this.level = level;
this.middleResult = middleResult;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getMiddleResult() {
return middleResult;
}
public void setMiddleResult(int middleResult) {
this.middleResult = middleResult;
}
public int getKey() {
return key;
}
public void setKey(int key) {
this.key = key;
}
@Override
public int compareTo(User o) {
return this.level - o.getLevel();
}
//Сравнение по уровням а зетем по времени - начало
public static Comparator<User> levelSort = new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
int result = (int) o2.getLevel() - o1.getLevel();
if (result !=0){
return result;
}else{
return o1.getMiddleResult() - o2.getMiddleResult();
}
}
};
//Сравнение по уровням а затем по времени - конец
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User item = (User) o;
return Objects.equals(name, item.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}