جستجودر لیست ویو داینامیک
سلام چند وقته دارم دنبال کدش میگردم ولی پیدا نکردم ممنون ازدوستان اگر کدشو بزارن در ضمن کل انجمن و استکو و... رو گشتم ممنون





یه کد پیدا کردم کسی میتونه کمک کنه با توجه به لیست ویو استاد یه سری تغییرات بده توش اینم لینک ممنون

1: جست و جو باید روی دیتا باشه نه لیست ویو، یعنی زمانی که دیتا رو از دیتابیس میگیرید، در دستورات sql محدودیت هارو اعمال کنید.
2: لیست ویوی داینامیک منظورتون چیه؟ لیست ویو که داینامیک نمیشه، میشه آداپتر داینامیک نوشت.
3: برای نوشتن آداپتر داینامیک باید کاملا با generic type ها آشنایی داشته باشید
4: باید هر عملیات رو توی یک کلاس انجام بدید، مثلا getView رو در یک کلاس با پارامتر های ورودی که میتونه id ویو و ... باشه تعریف کنید و در کلاس های دیگتون ازش استفاده کنید، نه اینکه همه رو توی چندین آداپتر بنویسید.
5: چون موارد بالا رو 1 روزه نمیتونید یاد بگیرید، راه ساده تر رو میگم، مورد اول رو یاد بگیرید و استفاده کنید، وقتی مثلا با یک دکمه جست و جو تون تغییر کرد، فقط کافیه notifyDataSetChange کنید.

میتونید به این یه نگاه کنید ببینید به کارم میاد من یه کلید سرچ بالای لیست ویوم گذاشتم با کلیک روی سرچ یه ادیت تکس جلوی کلید سرچ باز میشه میخوام متنی رو که واردش میکنی حرف به حرف تو لیست ویویی که زیرش هست رو فیلتر کنه میتونید کمکم کنید

متد زیر رو خودم نوشتم تو اکتیویتی لیست اجرا میشه وقتی تو ادیت باکس کلمه نوشته میشه فرستاده میشه به متد زیر ولی عمل نمیکنه کده درست یا نه میتونید تصححیحش کنید ممنون
کد ادیت باکس
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
filter(text);
}
------------------------------------------------------
کد متد filter
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
applications.clear();
if (charText.length() == 0) {} else {
for (StructApplication application: applications) {
if (application.title.toLowerCase(Locale.getDefault())
.contains(charText)) {
applications.add(application);
adapter = new Adapter(applications);
list.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
}
}

بچه ها اوکی شداز همون روش اول دوست گلم حاج حسینی عزیز رفتم جواب گرفتم خیلی ساده یه کوئری مستقیم از دیتا بیس وبعدش یه notifyDataSetChanged ساده بازم ممنون از حاج حسینی عزیز ولی باز هم اگر کسی کدی چیزی داشت که اداپترو به صورت دینامیک فیلتر کنه اینجا بنویسه ممنون

ارتباط زیاد با DataBase برنامه رو سنگین می کنه
فقط زمانی کاری انجام می شه که بهش نیاز باشه(مثل ارتباط با DataBase )
از روش زیر استفاده کنید:
- پر کردن ArrayList مادر از دیتابیس
- افزودن ArrayList مادر به ArrayList دوم
- تزریق ArrayList دوم به Adapter
- جستجو در ArrayList مادر و تزریق مقادیر به ArrayList دوم
- تزریق ArrayList دوم به Adapter
- شاد باشید

یکی از بچه ها کد خواسته بود برای سرچ تو دیتا بیس و اعمال تو نتایج تو لیست ویو من کدو کامل نذلشتم چون یه سری کد متفرقه قاطیشه که یه کم گنگه ولی توضیحات رو مینویسم
1.تواکتیویتی لیست ویوتون یه ادیت تکس میذارید ویهaddTextChangedListener براش میذارید
2.تو اکتیویتی لیست ویوتون میایید زمان کوئری گرفتن مثل کد زیر عمل میکونید
مرحله 1
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
txtSearch = inputSearch.getText().toString();
searchdatabase();
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
});
مرحله2
کوئری گرفتن از دیتابیس
Cursor cursor = null;
applications.clear();
DataBaseConnection db = new DataBaseConnection(this, "norooz", 5);
SQLiteDatabase database = db.getReadableDatabase();
cursor = database.rawQuery("SELECT * FROM first WHERE tilte LIKE '%" + txtSearch + "%'", null);
while (cursor.moveToNext())
{
StructApplication application = new StructApplication();
application.title = cursor.getString(cursor.getColumnIndexOrThrow("tilte"));
application.matn = cursor.getString(cursor.getColumnIndexOrThrow("matn"));
application.fav = cursor.getString(cursor.getColumnIndexOrThrow("fav"));
application.see = cursor.getString(cursor.getColumnIndexOrThrow("see"));
application.id = cursor.getInt(cursor.getColumnIndexOrThrow("id"));
application.v = cursor.getInt(cursor.getColumnIndexOrThrow("v"));
application.p = cursor.getInt(cursor.getColumnIndexOrThrow("p"));
application.i = cursor.getInt(cursor.getColumnIndexOrThrow("i"));
applications.add(application);
}
cursor.close();
adapter.notifyDataSetChanged();
}

این روشی که من رفتم اشتباه ؟؟ البته من یه متد دیگه دارم که کل اطلاعات رو در اول از دیتابیس من میگیره !
edtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
String txtSearch = edtSearch.getText().toString();
populateSearchFromServer(txtSearch);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
});
public static void populateSearchFromServer(String searchItem) {
ModuleWebservice module = new ModuleWebservice();
ModuleWebservice.Listener listener = new ModuleWebservice.Listener() {
@Override
public void onDataReceive(String data) {
Log.i("LOG", "Webservice Data: " + data);
if (data != null) {
try {
app.clear();
JSONArray series = new JSONArray(data);
for (int i = 0; i < series.length(); i++) {
JSONObject object = series.getJSONObject(i);
StructSerials serial = new StructSerials();
app.id = object.getLong("app_id");
app.name = object.getString("app_name");
app.ratingValue = (float) object.getDouble("app_rating");
app.logoUrl = object.getString("app_logourl");
app.genre = object.getString("app_genre");
app.appStory = object.getString("app_story");
app.year = object.getInt("app_year");
app.votes = object.getString("app_vote");
app.appCancel = object.getString("app_cancel");
app.appPicUrl1 = object.getString("app_pic1");
app.appPicUrl2 = object.getString("app_pic2");
app.appPicUrl3 = object.getString("app_pic3");
app.appPicUrl4 = object.getString("app_pic4");
}
adapter.notifyDataSetChanged();
}
catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onFail(int statusCode) {
switch (statusCode) {
case ModuleWebservice.IO_EXCEPTION:
Log.i("LOG", "IO Exception");
break;
case ModuleWebservice.PROTOCOL_EXCEPTION:
Log.i("LOG", "PROTOCOL Exception");
break;
case ModuleWebservice.UNKNOWN_EXCEPTION:
Log.i("LOG", "UNKNOWN Exception");
break;
}
}
};
ArrayList<NameValuePair> input = new ArrayList<NameValuePair>();
input.add(new BasicNameValuePair("searchItem", searchItem));
module.url("http://192.168.1.50/app-server/search.php?action=readsearch", input)
.inputArguments(input)
.listener(listener)
.cacheDir(G.DIR_CACHE)
.enableCache(false)
.cacheExpireTime(3)
.connectionTimeout(3000)
.socketTimeout(5000)
.read();
}

من با نظر hosein kurd موافقم
رتباط زیاد با DataBase برنامه رو سنگین می کنه
فقط زمانی کاری انجام می شه که بهش نیاز باشه(مثل ارتباط با DataBase )
از روش زیر استفاده کنید:
- پر کردن ArrayList مادر از دیتابیس
- افزودن ArrayList مادر به ArrayList دوم
- تزریق ArrayList دوم به Adapter
- جستجو در ArrayList مادر و تزریق مقادیر به ArrayList دوم
- تزریق ArrayList دوم به Adapter
- و کد زیر را که جواب گرفتم پیشنهاد میکنم
-
final EditText edtSearch = (EditText) getActivity().findViewById(R.id.edtSearch);
edtSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
String txtSearch = edtSearch.getText().toString().toLowerCase(Locale.getDefault());
int idSearch = 0;
try {
idSearch = Integer.parseInt(txtSearch);
} catch(NumberFormatException nfe) {
System.out.println("Could not parse " + nfe);
}
tempArrayList.clear();
if (txtSearch.length() == 0) {
//tempArrayList = origins;
adapterOrigin = new AdapterOriginList(origins, getActivity(),
getActivity().getSupportFragmentManager());
} else {
for (StructOrigin origin : origins) {
if ((origin.getOriginEn().toLowerCase(Locale.getDefault()).contains(txtSearch))
| (origin.getOriginFa().toLowerCase(Locale.getDefault()).contains(txtSearch))
| (origin.getOriginId() == idSearch)) {
tempArrayList.add(origin);
}
}
adapterOrigin = new AdapterOriginList(tempArrayList, getActivity(),
getActivity().getSupportFragmentManager());
}
listOrigins.setAdapter(adapterOrigin);
adapterOrigin.notifyDataSetChanged();
}
});
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .