Как добавить поиск по listview
Добрый день более опытные коллеги. Научите пожалуйста, как добавить поиск на страницу с listview Данные заполняются с Firebase Realtime, объём данных более 500+ записей, без поиска плохо. Читал пробовал разные примеры, но всегда крашит приложение.
прикладываю код класса:
package com.krascsm.csm;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class ReadActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> adapter;
private List<String> listData;
private List<User> listTemp;
private DatabaseReference mDataBase;
private String USER_KEY = "People";
public void mainclick(View v) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
public void timeclick(View v) {
Intent intent = new Intent(this, Times.class);
startActivity(intent);
}
public void workclick(View view){
Intent intent = new Intent(this, WorkPage.class);
startActivity(intent);
}
public void contactclick(View view){
Intent intent = new Intent(this, Contact.class);
startActivity(intent);
}
public void regclick(View view){
/*
Intent intent = new Intent(this, reg.class);
startActivity(intent);
*/
Intent intent = new Intent(this, ReadActivity.class);
startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.read_layout);
init();
getDataFromDB();
setOnClickItem();
}
public void init() {
listView=findViewById(R.id.listview);
listData = new ArrayList<>();
listTemp = new ArrayList<>();
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
listView.setAdapter(adapter);
mDataBase= FirebaseDatabase.getInstance().getReference(USER_KEY);
}
private void getDataFromDB() {
ValueEventListener vListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(listData.size() > 0) listData.clear();
if(listTemp.size() > 0) listTemp.clear();
for (DataSnapshot ds : snapshot.getChildren()) {
User user = ds.getValue(User.class);
assert user != null;
listData.add(user.fio);
listTemp.add(user);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
mDataBase.addValueEventListener(vListener);
}
private void setOnClickItem() {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
User user = listTemp.get(i);
Intent intent = new Intent(ReadActivity.this, ShowActivity.class);
intent.putExtra(Constant.USER_NAME,user.name);
intent.putExtra(Constant.USER_SEC_NAME,user.sec_name);
intent.putExtra(Constant.USER_EMAIL,user.email);
intent.putExtra(Constant.USER_FIO,user.fio);
intent.putExtra(Constant.USER_DOLJNOST,user.doljnost);
intent.putExtra(Constant.USER_PHONE,user.phone);
intent.putExtra(Constant.USER_VNPHONE,user.vnphone);
intent.putExtra(Constant.USER_MOBILE,user.mobile);
intent.putExtra(Constant.USER_STATUS,user.status);
intent.putExtra(Constant.USER_OTDEL,user.otdel);
intent.putExtra(Constant.USER_CABINET,user.cabinet);
startActivity(intent);
}
});
}
}
также код Layout:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<ListView
android:id="@+id/listview"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginTop="100dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/constraintLayout"
app:layout_constraintTop_toBottomOf="@+id/textView23" />
<TextView
android:id="@+id/textView23"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="Справочник"
android:textSize="45sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/listview"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Ответы (1 шт):
Автор решения: ACTPOHOM
→ Ссылка
Возможно вам следует использовать SearchView в xml, после чего отслеживать изменение в SearchView.
SearchText = findViewById(R.id.serchaview);
SearchText.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
text-from_SearchView = query;
//do something
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
text-from_SearchView = newText;
//do something
return false;
}
});
после этого искать в Firebase нужные вам записи. Каждый раз как вы изменяете текст в SearchView делать запрос на поиск нужные записи.