آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

kamal_hajatmand  10 سال پیش  10 سال پیش
0 0

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

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

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

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

0 0
لطفا راهنمایی میکنید (10 سال پیش)
+1 0
اگر از دیتابیس میخونی باید توی لیستنر تغییر مقدار باکست کد ها رو انجام بدی لینک (10 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
offset  10 سال پیش
0 0

سلام دوستان

به نظر من نیاز نیست برای جستجو بر اساس یک فیلد شما هر بار یه کوئری از دیتابیس بزنید بهتر اینه که دو تا 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 ریخته مشه و در نهایت هم در لیست ویو نمایش داده می شود .

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

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