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

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

jamal2012  9 سال پیش  8 سال پیش
+4 0

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

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

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

0 0
یکی کمک کنه دارم رد میدم دیگه (9 سال پیش)
0 0
help (9 سال پیش)
0 0
دوستان کمک کنید (9 سال پیش)
پاسخ به سوال 
Hajhosseini  9 سال پیش
+6 0

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

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

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

0 0
این لینک رو ببین. (9 سال پیش)
پاسخ به سوال 
jamal2012  9 سال پیش
+1 0

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

 
کد ادیت باکس


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


}
}
}
}
+2 0
کسی نمیدون یعنی بی خیالش شم این مشکل خیلی ها میتونه با شه ( سرچ تو لیست ویو استاد) (9 سال پیش)
+1 0
این فکر کنم جواب بده یکی بیاد یه سری تغییرات توش بده ردیفه (9 سال پیش)
پاسخ به سوال 
jamal2012  9 سال پیش
+1 0

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

+1 0
آداپتر اصلا نباید فیلتر بشه، اون داینامیکی که گفتم منظورم توی گرفتن Layout های مختلف توی یک لیست، و استفاده از 1 آداپتر در چندین لیست که هیچ شباهتی با هم ندارن بود. کار آداپتر فقط نمایش لیست هست و اینکه لیست دارای چند آیتمه و چه محتوایی داره بهش مربوط نمیشه، روش درست همینی هست که انجام دادید. (9 سال پیش)
0 0
بله میدونم اداپتر فیلتر نمیشه در واقع باید اون ارایه ای که از اون نوع جنریک ما ساخته شده باید فیلتر بشه بعد وصل بشه به اداپتر این موضوع باعث شد که با تمام قسمت های لیست ویو اشنا بشم به طور کامل و موتورشو بیارم پایین ولی از راه دیگه ای مشکل حل شد (9 سال پیش)
+1 0
یعنی هر دفعه که EditText تغییر میکنه یکبار از اول اطلاعات رو از دیتابیس میگیری و به لیست ویو میدی؟ (9 سال پیش)
پاسخ به سوال 
Hossein Kurd  9 سال پیش
+3 0

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

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

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

  1. پر کردن ArrayList مادر از دیتابیس
  2. افزودن ArrayList مادر به ArrayList دوم
  3. تزریق ArrayList دوم به Adapter
  4. جستجو در ArrayList مادر و تزریق مقادیر به ArrayList دوم
  5. تزریق ArrayList دوم به Adapter
  6. شاد باشید
0 0
ممنون از پاسختون ولی همون روش اول با برنامه من جوره چون من جست وجو رو با موضوع های مختلف انجام میدم یعنی تو هر سرچ 100 تا 200 رکورد بیشتر سرچ نمیشه (9 سال پیش)
+2 0
برای انجام هر کاری دو راه وجود داره: 1. راه اصولی 2. راهی که فقط به نتیجه می رسه،تاکبد ندارم کارم اصولیه، اما سعی می کنم کمتر به مشکل بر بخورم. (9 سال پیش)
0 0
فکر کنم با قسمت ویدئو ساخت مارکت که استاد از دیتابیس آفلاین اطلاعات رو می گرفتند یک سری محدودیت ها اعمال میکردند که لیست به انواع مختلف دیده میشد. (9 سال پیش)
0 0
آقای Hossein Kurd میشه روشی رو که فرمودید با مثال توضیح بدید ممنون میشم. (9 سال پیش)
0 0
اقای kurd در بالا روشی برای سرچ را پیشنهاد میدند دوستان کسی می تونه در مورد روش ایشون بیشتر توضیح بده؟ (9 سال پیش)
پاسخ به سوال 
jamal2012  9 سال پیش
+5 0

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

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





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

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

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

}
+1 0
من مشکلی نمیبینم، بهتره دیباگ کنید کدهای جایی که مشکل داره رو قرار بدید، اینجوری نمیشه گفت این کد درست کار میکنه یا خیر. (9 سال پیش)
0 0
اول که برنامه رو اجرا میکنم لیست کامل نشون داده میشه.بعد در داخل edittext کلمه مورد نظر رو مینویسم درخواست به سرور میره دیتا دریافت میشه ولی روی لیست وییو چیزی نمایش داده نمیشه. ارروری هم نمایش داده نمیشه ! نمیشه حدس زد مشکل از کجاست ؟ (9 سال پیش)
0 0
توی onDataReceive شما try catch گذاشتید، اونو وردارید ببینید اررور میده یا نه، اگر نداد توی همون متد دیباگ کنید و بعد از adapter.notfy... ببینید چه اتفاقی می افته (9 سال پیش)
پاسخ به سوال 
tiam  8 سال پیش
0 0

من با نظر 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();

    }
    });

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