سلام دوستان
من قابلیت جست جو رو ایجاد کردم ولی درست کار نمیکنه...در واقع وقتی چیزی تو ادیت تکست وارد میکنید اون آیتم هایی که باید برگردونه رو نمیکنه...
و همینطور وقتی change configuration اتفاق میوفته دیتا فیلتر شده از بین میره..
کلاس ویو مدل از ViewModel اکستند هم کرده...
تو کلاس MainActivity هم به همون صورت که اقای شاهینی گفتند instance گرفتم
به این صورت از دیتابیس query میگیرم
StudentDao.class
@Query("SELECT * FROM students WHERE firstName OR lastName LIKE '%' || :query || '%'")
LiveData<List<Student>> getStudentFiltered(String query);
StudentRepository.class
public LiveData<List<Student>> getFilteredStudents(String q){
return studentsDao.getStudentFiltered(q);
}
MainViewModel.class
public LiveData<List<Student>> getStudentsFiltered(String a){
return repository.getFilteredStudents(a);
}
MainActivity.class
EditText editText = findViewById(R.id.search_box_main);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence editable, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (editable.length() > 0) {
viewModel.getStudentsFiltered(editable.toString()).observe(MainActivity.this, students -> {
adapterMainRecycler.replaceStudents(students);
});
} else {
adapterMainRecycler.replaceStudents(studentList);
}
}
});
مقدار studentList از اول که خواستم آیتم ها رو بگیرم داخل یه متغیر ریختم و دیگه دوباره observe نکردم برای دریافت کل آیتم ها...
کلاس اداپتر هم به این صورته:
AdapterMainRecycler.class
public void replaceStudents(List<Student> students) {
this.studentList=students;
notifyDataSetChanged();
}
سلام و احترام
برای کار با سرور عموما به ما یک Api برای |Search میدهند که این قضیه رو به راحتی بتوانیم هندل کنیم.
اما اگر هدف شما صرفا تمرین هست مشکل کد شما من فکر میکنم خط زیر هست
else {
adapterMainRecycler.replaceStudents(studentList);
}
چرا که شما امدید و از آداپتر استفاده کردید که وقتی configuration change تغییر میکند عملا adapter ما new شده و تغییرات از بین میروند
در صورتی که نباید چنین صورتی باشد چون لایو دیتا از لیست تغییرات آگاه هست باید دیتا های ذخیره شده را صرفا در اکتیویتی یا فرگمنتتان observe کنید .
یه نکته اضافه تر هم خدمتتون عرض کنم این هست که سعی کنید از viewBinding استفاده کنید و از findView استفاده نکنید
موفق باشید
سلام
اون رو هم تست کردم... درواقع دوباره لیست رو observe کردم...
فقط تمرینه یه جورایی...
ولی همین طور که گفتم search رو به درستی انجام نمیده...آیتم های که باید برگردونه رو بر نمیگردونه...اینش خیلی جالبه