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

جستجودر لیست ویو داینامیک

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

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

نظرات

Spirit 11 سال پیش
این جمله ای هست که خودم هم بهش رسیدم :) کد همیشه یافتنی نیست، گاهی نوشتنیست :) (اگر نکته ای پیدا کردم مینویسم اینجا)
وحید 11 سال پیش
خب یک راه غیر منطقیش فکر کنم اینه اگر از دیتابیس می خونید می تونید یک کوری بگیرید و بگید اگر برابر با فلان بود نشون بده.
jamal2012 11 سال پیش
سلام SPIRIT عزیز حرفتو کاملا قبول دارم من تو این فروم خیلی کم شده در خواست کد کنم یا اصلا نشده (دقیقا یادم نیست) معمولا هم درخواست به کمک کردم یا یه ایده تو نوشتن کد مورد نظرم ولی تو این مورد دیگه عاجز شدم یک هفتست که دارم تلاشمو میکنم (خنده داره) با کد های لیست ویو کلنجار رفتم ولی به جایی نرسیدم کل استکو گشتم نبود یا اگر هم بود من نفهمیدم اینم به خاطر اینه که از همون اول با لیست ویو استاد مشکل داشتم یه کم فهمش برام سخته حالا هم ممنون میشم با توجه به لیست ویو استاد یه کد بنویسید اینجا ممنون

پاسخ‌ها 9

jamal2012 11 سال پیش

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

نظرات

jamal2012 11 سال پیش
یکی کمک کنه دارم رد میدم دیگه
jamal2012 11 سال پیش
دوستان کمک کنید
Hajhosseini 11 سال پیش

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

نظرات

jamal2012 11 سال پیش
ممنون از راهنماییتون به خاطر همینه که گفتم دارم رد میدم یه کد اماده میخوام
jamal2012 11 سال پیش
در مورد مورد اول کد ندارین
jamal2012 11 سال پیش

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

نظرات

jamal2012 11 سال پیش

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

 
کد ادیت باکس


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();


}
}
}
}

نظرات

jamal2012 11 سال پیش
کسی نمیدون یعنی بی خیالش شم این مشکل خیلی ها میتونه با شه ( سرچ تو لیست ویو استاد)
jamal2012 11 سال پیش
این فکر کنم جواب بده یکی بیاد یه سری تغییرات توش بده ردیفه
jamal2012 11 سال پیش

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

نظرات

Hajhosseini 11 سال پیش
آداپتر اصلا نباید فیلتر بشه، اون داینامیکی که گفتم منظورم توی گرفتن Layout های مختلف توی یک لیست، و استفاده از 1 آداپتر در چندین لیست که هیچ شباهتی با هم ندارن بود. کار آداپتر فقط نمایش لیست هست و اینکه لیست دارای چند آیتمه و چه محتوایی داره بهش مربوط نمیشه، روش درست همینی هست که انجام دادید.
jamal2012 11 سال پیش
بله میدونم اداپتر فیلتر نمیشه در واقع باید اون ارایه ای که از اون نوع جنریک ما ساخته شده باید فیلتر بشه بعد وصل بشه به اداپتر این موضوع باعث شد که با تمام قسمت های لیست ویو اشنا بشم به طور کامل و موتورشو بیارم پایین ولی از راه دیگه ای مشکل حل شد
Ali 11 سال پیش
یعنی هر دفعه که EditText تغییر میکنه یکبار از اول اطلاعات رو از دیتابیس میگیری و به لیست ویو میدی؟
Hossein Kurd 11 سال پیش

ارتباط زیاد با DataBase برنامه رو سنگین می کنه

فقط زمانی کاری انجام می شه که بهش نیاز باشه(مثل ارتباط با DataBase )

از روش زیر استفاده کنید:

  1. پر کردن ArrayList مادر از دیتابیس
  2. افزودن ArrayList مادر به ArrayList دوم
  3. تزریق ArrayList دوم به Adapter
  4. جستجو در ArrayList مادر و تزریق مقادیر به ArrayList دوم
  5. تزریق ArrayList دوم به Adapter
  6. شاد باشید

نظرات

jamal2012 11 سال پیش
ممنون از پاسختون ولی همون روش اول با برنامه من جوره چون من جست وجو رو با موضوع های مختلف انجام میدم یعنی تو هر سرچ 100 تا 200 رکورد بیشتر سرچ نمیشه
Hossein Kurd 11 سال پیش
برای انجام هر کاری دو راه وجود داره: 1. راه اصولی 2. راهی که فقط به نتیجه می رسه،تاکبد ندارم کارم اصولیه، اما سعی می کنم کمتر به مشکل بر بخورم.
وحید 11 سال پیش
فکر کنم با قسمت ویدئو ساخت مارکت که استاد از دیتابیس آفلاین اطلاعات رو می گرفتند یک سری محدودیت ها اعمال میکردند که لیست به انواع مختلف دیده میشد.
f-Dehghan 11 سال پیش
آقای Hossein Kurd میشه روشی رو که فرمودید با مثال توضیح بدید ممنون میشم.
ابراهیم 10 سال پیش
اقای kurd در بالا روشی برای سرچ را پیشنهاد میدند دوستان کسی می تونه در مورد روش ایشون بیشتر توضیح بده؟
jamal2012 11 سال پیش

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

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();
}





نظرات

شهریار توکلی 11 سال پیش
دوست عزیز اگه کوئری رو بخای از سرور بگیری چی جوری میشه ؟ یه راهنمایی میتونی بکنی ؟
Hajhosseini 11 سال پیش
توی لیست هایی که تعداد فیلد های بالایی داره، این روش بهترین روشه... توی لیست های کوتاه (زیر 1000-2000 فیلد)، روش حسین کرد بهتر عمل میکنه. برای اینکه از وب سرویس بتونید اطلاعات رو دریافت کنید میتونید به همین صورت عمل کنید ولی از کش وب سرویس استفاده کنید.
شهریار توکلی 11 سال پیش
یه توضیح میدین من چی جوری میتونم از کش وب سرویس استفاده کنم ؟ من از روش بالا رفتم ولی وقتی درخواست میدم به سرور کوئری مورد نظر فرستاده میشه ولی روی لیست ویوو چیزی نمایش نمیده !؟
Hajhosseini 11 سال پیش
مشکل شما ارتباطی با کش وب سرویس نداره، باید دیباگ کنید و ببینید توی کدوم قسمت مشکل وجود داره، ممکنه دیتا اصلا گرفته نشه، ممکنه دیتا توی لیست ریخته نشه، ممکنه لیستی که به اداپتر میفرستید خالی باشه، ممکنه آداپتر مشکل داشته باشه و ... کش وب سرویس هم توی آموزش های استاد توضیح داده شده
Pooya 10 سال پیش
ممنون از کدی که گذاشتی، خیلی خوب کار می کنه و کار منو راه انداخت. با یه مقدار تغیییر تونستم با توجه به یک متن تو ستون های مختلف دنبال آیتم مورد نظر بگردم
شهریار توکلی 11 سال پیش

این روشی که من رفتم اشتباه ؟؟ البته من یه متد دیگه دارم که کل اطلاعات رو در اول از دیتابیس من میگیره ! 

   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();

}

نظرات

Hajhosseini 11 سال پیش
من مشکلی نمیبینم، بهتره دیباگ کنید کدهای جایی که مشکل داره رو قرار بدید، اینجوری نمیشه گفت این کد درست کار میکنه یا خیر.
شهریار توکلی 11 سال پیش
اول که برنامه رو اجرا میکنم لیست کامل نشون داده میشه.بعد در داخل edittext کلمه مورد نظر رو مینویسم درخواست به سرور میره دیتا دریافت میشه ولی روی لیست وییو چیزی نمایش داده نمیشه. ارروری هم نمایش داده نمیشه ! نمیشه حدس زد مشکل از کجاست ؟
Hajhosseini 11 سال پیش
توی onDataReceive شما try catch گذاشتید، اونو وردارید ببینید اررور میده یا نه، اگر نداد توی همون متد دیباگ کنید و بعد از adapter.notfy... ببینید چه اتفاقی می افته
tiam 10 سال پیش

من با نظر hosein kurd  موافقم

رتباط زیاد با DataBase برنامه رو سنگین می کنه

فقط زمانی کاری انجام می شه که بهش نیاز باشه(مثل ارتباط با DataBase )

از روش زیر استفاده کنید:

  1. پر کردن ArrayList مادر از دیتابیس
  2. افزودن ArrayList مادر به ArrayList دوم
  3. تزریق ArrayList دوم به Adapter
  4. جستجو در ArrayList مادر و تزریق مقادیر به ArrayList دوم
  5. تزریق ArrayList دوم به Adapter
  6. و کد زیر را که جواب گرفتم پیشنهاد میکنم
  7. 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();

    }
    });

نظرات


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