PDA

View Full Version : مشکل در لیست ویو(list view)



hadihs
جمعه 06 شهریور 1394, 23:05 عصر
سلام به همه
من میخواهم یک قابلیت جستجو به نرم افزارم اضافه کنم.
از یک روشی استفاده کردم ولی بعد از پاک کردن متنی که در edittext برای متن جستجو نوشته ام force close میداد.برای همین در اینجا سوالم رو مطرح کردم.

میخوام یه صفحه ای باشه که بالاش یک edittext برای دریافت متن کاربر و زیرش یک listview باشه که برای نمایش لحظه ای جستجو شده ها باشه.
توجه کنید که میخوام سطر های listview سفارشی باشه. درهر سطر حداقل یک نوشته کوتاه مانند عنوان باشه که وقتی روش کلیک میشه یه کاری کنه. فقط لطفا سطر هاش سفارشی باشه چون اگه اینطوری بهم بدید میتونم خودم چیز های دیگری را به آن اضافه کنم.
اگه میشه یاعناوین هر سطر از دیتابیس گرفته بشه و یا از string هایی که در پوشه value ذخیره شده استفاده بشه.

اگه لطف کنید با توضیح بدین خوبه ولی اگه هم نمیتونین با یک توضیح فقط جمالی فقط کد های مورد نیاز را هم بدین کافیه. خودم توش رو میگردم و امیدوارم بفهمم چی کار کردین.
چون روش خودم force closeداد خیلی اعصابم خورده.خیلی وقت گذاشته بودم. برای همین بیصبرانه منتظر کمک های شما عزیزان هستم.
خیلی خیلی ممنون از تمام کسانی که وقتشون رو برای کمک کردن گذاشتن.

mimre73
شنبه 07 شهریور 1394, 00:04 صبح
سلام به همه
من میخواهم یک قابلیت جستجو به نرم افزارم اضافه کنم.
از یک روشی استفاده کردم ولی بعد از پاک کردن متنی که در edittext برای متن جستجو نوشته ام force close میداد.برای همین در اینجا سوالم رو مطرح کردم.

میخوام یه صفحه ای باشه که بالاش یک edittext برای دریافت متن کاربر و زیرش یک listview باشه که برای نمایش لحظه ای جستجو شده ها باشه.
توجه کنید که میخوام سطر های listview سفارشی باشه. درهر سطر حداقل یک نوشته کوتاه مانند عنوان باشه که وقتی روش کلیک میشه یه کاری کنه. فقط لطفا سطر هاش سفارشی باشه چون اگه اینطوری بهم بدید میتونم خودم چیز های دیگری را به آن اضافه کنم.
اگه میشه یاعناوین هر سطر از دیتابیس گرفته بشه و یا از string هایی که در پوشه value ذخیره شده استفاده بشه.

اگه لطف کنید با توضیح بدین خوبه ولی اگه هم نمیتونین با یک توضیح فقط جمالی فقط کد های مورد نیاز را هم بدین کافیه. خودم توش رو میگردم و امیدوارم بفهمم چی کار کردین.
چون روش خودم force closeداد خیلی اعصابم خورده.خیلی وقت گذاشته بودم. برای همین بیصبرانه منتظر کمک های شما عزیزان هستم.
خیلی خیلی ممنون از تمام کسانی که وقتشون رو برای کمک کردن گذاشتن.
شما میتونید از فیلتر ها استفاده کنید
اگه خواستین این روشو بهتون کمک کنم

hadihs
شنبه 07 شهریور 1394, 06:04 صبح
شما میتونید از فیلتر ها استفاده کنید
اگه خواستین این روشو بهتون کمک کنم
سلام
بله.لطفا اگه میشه راهنمایی کنید.چون من از دستورات queryبرای نوشتن عناوین از دیتابیس استفاده کردم.فک کنم فیلتر یه چیز دیگست.
منتظر هستم
ممنون

mimre73
شنبه 07 شهریور 1394, 12:08 عصر
سلام
بله.لطفا اگه میشه راهنمایی کنید.چون من از دستورات queryبرای نوشتن عناوین از دیتابیس استفاده کردم.فک کنم فیلتر یه چیز دیگست.
منتظر هستم
ممنون
خب شما اول تو کلاسی که adapter لیست ویو رو ساختین یه کلاس ایجاد کنید و اونو از فیلتر extends کنید دو متد داره که باید override بشه
اولی performFiltering
و دومی
values اسم کلاسی هست که مقادیر لیست ویو داخلشون هست
publishResults

که بعد از extends کردن خودشون نمایان میشن
حالا نیاز به دو تا لیست دارید

private List<Values> dictlist;
private List<Values> orgidictlist;
private class DictFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {

results.values = orgidictlist;
results.count = orgidictlist.size();
}
else
{
List<Values> ndictList=new ArrayList<Values>();
for (Values p : dictlist) {
if (p.متدی که میخواین بر حسب اون سرچ کنیدtoUpperCase().startsWith(constraint.toStri ng().toUpperCase)(()))
ndictList.add(p);
}

results.values = ndictList;
results.count = ndictList.size();


}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {

if (results.count == 0)
notifyDataSetInvalidated();
else {
dictlist = (ArrayList<Values>) results.values;
notifyDataSetChanged();
}
}

}


حالا به کلاسی که لیست ویو داخلشه برگردین
بعد از setadapter به لیستتون این قابلیت رو میدین به عنوان مثال اسم لیست من showlv

showlv.setTextFilterEnabled(true);
final EditText etsearch=(EditText)findViewById(R.id.etfilter);
etsearch.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (count < before) {
ad.resetData();
}
ad.getFilter().filter(s.toString());
}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub

}

@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub

}
});


نکته اینکه اسم adapter من ad هست و تمام.