بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

ایجاد فیلتر برای لیست ویو سفارشی

مدیریت گفتگو
kamal_hajatmand 10 سال پیش
آخرین تغییر: 10 سال پیش

من با استفاده از اموزش های استاد یک لیست ویو سفارشی ایجاد کردم و در بالای آن یک ادیت باکس برای جستجو قرار دادم و میخوام کاری کنم که با ورود هر کاراکتر در لیست ویو جستجو شده و آپدیت بشه .

تا الان هم فهمیدم برای لیست ویو های ساده از دستور زیر در addTextChangedListener استفاده کنیم 

adapter.getFilter().filter(s.toString());

ولی این دستور در لیست ویو کاستوم کار نمیکنه و تا جایی که من متوجه شدم باید متد get filter  رو override کنیم . حالا کسی میتونه به من بگه که این متد باید کجا override  بشه و اگه ممکنه روش کار رو هم به طور کامل توضیح بده .

نظرات

mahdiFar77 10 سال پیش
اگر از دیتابیس میخونی باید توی لیستنر تغییر مقدار باکست کد ها رو انجام بدی لینک

پاسخ‌ها 1

offset 10 سال پیش

سلام دوستان

به نظر من نیاز نیست برای جستجو بر اساس یک فیلد شما هر بار یه کوئری از دیتابیس بزنید بهتر اینه که دو تا ArrayList در کلاس G تعریف کنی

      publicstaticArrayList<StructCountry>Array=newArrayList<StructCountry>();
publicstaticArrayList<StructCountry>Array_2;

حالا با یه کوئری Array  را از اطلاعات پایگاه پر می کنی  و بعدش Array_2  را از اطلاعات Array پر می کنی . و در نهایت لیست ویو هم با اطلاعات Array_2 پر میشه .

        G.Array=newArrayList<StructCountry>(G.Array_2);
adapter =newAdapterMartyr(G.Array_2);
lstContent.setAdapter(adapter);
adapter.notifyDataSetChanged();

حالا موقعی که کاربر برو روی plainText در حال وارد کردن عبارت هست سرچی انجام می ده و نتایج را نشون می ده .

         edt1.addTextChangedListener(newTextWatcher(){

@Override
publicvoid onTextChanged(CharSequence s,int arg1,int arg2,int arg3){
String searchString = edt1.getText().toString().trim();

int textLength = searchString.length();

G.Array_2.clear();
StringRsearch="";
for(int i =0; i <=(G.Array.size()-1); i++){
if(seter ==1){
Rsearch= G.Array.get(i).فیلدموردنظر;
}
if(seter ==2){
Rsearch= G.Array.get(i).فیلدموردنظر;
}
if(seter ==3){
Rsearch= G.Array.get(i).فیلدموردنظر;
}
if(seter ==4){
Rsearch= G.Array.get(i).فیلدموردنظر;
}
if(seter ==5){

Rsearch= G.Array.get(i).name;
}
if(textLength <=Rsearch.length()){

if(searchString.equalsIgnoreCase(Rsearch.substring(0, textLength)))
G.Array_2.add(G.Array.get(i));
}
}
adapter.notifyDataSetChanged();

}

در واقع با این کار به جای اینکه هر بار کوئری در پایگاه زده بشه و نتایج در لیست ویو نمایش داده بشه ، ای سرچ درون Array انجام میشه و نتیجه در Array_2 ریخته مشه و در نهایت هم در لیست ویو نمایش داده می شود .

نظرات

mahdiFar77 10 سال پیش
اگه تعداد رکورد 10000 تا باشه تکلیف چیه؟
kamal_hajatmand 10 سال پیش
با mahdiFar77 موافقم ، این روشی برای مواردی که تعداد رکورد ها زیاده خوب نیست ، روش اصولی برای پیاده سازی اینکار override کردن متد getFilter() در اداپتر ساخته شده می باشد ، مشکل من هم در واقع نحوه override کردن همین متد می باشد.
offset 10 سال پیش
تا اونجایی که من میدونم توی هیچ برنامه در لحظه 1000 رکود قرار نداره، چون اگر وجو داشته باشه در واقع میزان رم مورد استفاده پر میشه و برنامه بشدت کند و قطعا کرش هم رخ خواهد داد، بلکه در لحظه تعداد محدودی رکورد وجود داره و پس از اسکرول به سمت بالا وپایین مابقی داده به صورت تعداد محدود لود میشن و جای داده های قبلی قرار میگیرن. پس با این حساب اگر قراره بر روی کل ها داده های که در بانک ذخیره هستم جستجویی انجام بشه مثلا همون 1000 تا رکورد باید با دستور select داده های فیلتر شده را دریافت و در لیست نشون بدیم و اگر قراره بر روی داده های فعلی که (محدود هستن چون رم محدود هست) در حال نمایش در رم هستن سرچ زده بشه روش بالا فکر کنم مناسب باشه.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .