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

جست و جو در لیست ویو

بانوی شرقی  10 سال پیش  9 سال پیش
+2 0

سلام.

تقریبا قبلا هم چنین سوالی ، با اندکی تغییر نوشتم.

اما چون یکم فرق داشت دوباره مطرح میکنم

ببینید من تو کلاس G دستوری نوشتم که تیتر از پایگاه داده بخونه و لیست ویو م رو پر کنه

بالای لیست ویو یه ادیت باکس گذاشتم و کنارش دکمه ی سرچ قرار دادم.

حالا دستور این دکمه باید چی باشه و کجا تعریف بشه؟؟؟

 

0 0
تیتر سوال مناسب نیست ، لطفاً اصلاح کنید (10 سال پیش)
 برای این سوال 7 پاسخ وجود دارد.
پاسخ به سوال 
بانوی شرقی  10 سال پیش
+2 0

من چنین کدی نوشتم. کرش نمیکنه . اما گیر میکنه و بعد از چند دقیقه میره صفحه اصلی

EditText edtSearch = (EditText) findViewById(R.id.edtSearch);
        final String key = edtSearch.getText().toString();

        Button btnSearch = (Button) findViewById(R.id.btnSearch);
        btnSearch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Cursor cursor = G.database.rawQuery("SELECT  * FROM content WHERE title LIKE '%" + key + "%'", null);

                while (cursor.moveToFirst()) {
                    Struct item = new Struct();
                    item.title = cursor.getString(cursor.getColumnIndex("title"));
                    item.content = cursor.getString(cursor.getColumnIndex("content"));
                    lists.add(item);

                }
                cursor.close();
                adapter.notifyDataSetChanged();

            }
        });
پاسخ به سوال 
Hossein Kurd  10 سال پیش
+3 0

تصحیح کنید

 
                while (cursor.moveToNext()) {
                    Struct item = new Struct();
                    item.title = cursor.getString(cursor.getColumnIndex("title"));
                    item.content = cursor.getString(cursor.getColumnIndex("content"));
Log.v("iLOG" , "title : " + Item.title);
Log.v("iLOG" , "content : " + Item.content); lists.add(item); }

این رو امتحان کنید
چون کدی که شما نوشتین تعیین می کنه تا ابد توی چرخه بی افته

0 0
ممنونم از لطفتون. تصحیح کردم. نمیره صفحه اصلی. اما نتیجه ی سرچ هم چیزی نشون نمیده. (10 سال پیش)
0 0
وقتی دکمه ی جست و جو رو میزنم، listview رو پر نمیکنه و listvie خالی میشه (10 سال پیش)
0 0
یه لاگ بی انداز ببین اصلا چیزی می آره؟ (10 سال پیش)
0 0
من هرکاری کردم نتونستم geny motion رو نصب کنم و روی همون امولاتور های قدیمی کار میکنم که زبون فارسی ندارن. هر دفعه یه تغییر میدم و دوباره رو گوشیم نصب میکنم . برای همین به لاگ هم دسترسی ندارم. حروف لاتین رو تو امولاتورم مینویسم و سرچ میزنم تو لاگ چیزی نمینویسه و ارروری نشون نمیده (10 سال پیش)
+1 0
اون لاگهایی که اضافه کردم رو ببینید ؛ روی گوشیتون هم اگر کابل داربد می تونید لاگها رو ببینید (10 سال پیش)
+1 0
اضافه کردم. وقتی دکمه ی سرچ رو میزنم،بدون توجه به چیزی که مورد جست و جو قرار گرفته تمام تیترها و متن های داخل لیست ویو رو تو لاگ کت مینویسه (10 سال پیش)
0 0
خب ادپتر رو به روز رسانی کردی؟ (10 سال پیش)
+1 0
خب ادپتر رو به روز رسانی کردی؟ adapter.notyfiDataSetChanged رو بزن (10 سال پیش)
0 0
کدی که نوشتم رو ببینید. این کد که میگین هم گذاشتم. فقط ممکنه جایی که گذاشتم درست نباشه؟ (10 سال پیش)
+1 0
ادپتر کجا تعریف شده ؟ لیست ویو کجا به ادپتر داده شده (10 سال پیش)
0 0
تو پاسخ کلاس هام رو گذاشتم. (10 سال پیش)
پاسخ به سوال 
h_uk2009  10 سال پیش
0 0

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

 "SELECT * FROM table where (table.title like'" + '%' + input + "%') "
0 0
بازم حل نشد. وقتی دکمه ی جست و جو رو میزنم، listview رو پر نمیکنه :( (10 سال پیش)
پاسخ به سوال 
بانوی شرقی  10 سال پیش
0 0

کلاس G

public class G extends Application {

    public static Context           context;
    public static LayoutInflater    inflater;
    public static Activity          CurrentActivity;

    public static LocationManager   locationManager;

    public static SQLiteDatabase    database;
    public static final Handler     HANDLER    = new Handler();
    public static ArrayList lists      = new ArrayList();

    public static final String      DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
    public static final String      DIR_APP    = DIR_SDCARD + "/database";


    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        new File(DIR_APP).mkdirs();
        File file = new File(DIR_APP + "/database");

        if ( !file.exists()) {
            copydb();
        }

        database = SQLiteDatabase.openOrCreateDatabase(DIR_APP + "/database", null);

        Cursor cursor = database.rawQuery("SELECT * FROM content", null);

        while (cursor.moveToNext()) {
            try {
                Struct item = new Struct();
                item.title = cursor.getString(cursor.getColumnIndex("title"));
                item.content = cursor.getString(cursor.getColumnIndex("content"));

                lists.add(item);

            }
            catch (Exception e) {

            }

        }
        cursor.close();

    }


    private void copydb() {

        AssetManager assetManager = context.getAssets();
        InputStream inputStream;
        try {
            inputStream = assetManager.open("Context");
            HelperIO.copyFile(inputStream, DIR_APP + "/database");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

کلاس مکانها

public class Place extends Activity {

    public ArrayAdapter             adapter;
    public static ArrayList lists = new ArrayList();


    @Override
    protected void onResume() {
        G.CurrentActivity = this;
        super.onResume();

        if (adapter != null) {
            adapter.notifyDataSetChanged();
        }

    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.place);
        final ListView lstContent = (ListView) findViewById(R.id.lstContent);
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
        lstContent.setLayoutAnimation(new LayoutAnimationController(animation));

        adapter = new AdapterList(G.lists);
        lstContent.setAdapter(adapter);
        EditText edtSearch = (EditText) findViewById(R.id.edtSearch);
        final String key = edtSearch.getText().toString();

        Button btnSearch = (Button) findViewById(R.id.btnSearch);
        btnSearch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Cursor cursor = G.database.rawQuery("SELECT  * FROM content WHERE title = " + key, null);

                adapter.clear();
                while (cursor.moveToNext()) {
                    Struct item = new Struct();
                    item.title = cursor.getString(cursor.getColumnIndex("title"));
                    item.content = cursor.getString(cursor.getColumnIndex("content"));

                    Log.v("iLOG", "title : " + item.title);
                    Log.v("iLOG", "content : " + item.content);
                    lists.add(item);

                }
                cursor.close();
                adapter.notifyDataSetChanged();

            }
        });
    }
}
+1 0
مشخصه دیگه ، شما G.list رو دادین به ادپتر ، بعد اومدین list رو معرفی کردین ؛ آخه ادپتر بیچاره که list رو نمی شناسه ، G.list رو می شناسه (10 سال پیش)
0 0
اخه جز این هم مینویسم کرش میکنه. یعنی با این نوع نوشتن رو دکمه ی سرچ میزنم کرش میکنه (10 سال پیش)
0 0
از خط Cursor ایراد میگیره :( (10 سال پیش)
0 0
چه ایرادی ؟ (10 سال پیش)
0 0
چه ایرادی ؟ لاگ کت رو کپی کن ، کلاس G رو هم شلوغ نکن ، اون کدها رو توی اکتیویتی هنگام Oncreate بنویس (10 سال پیش)
0 0
شما یک بار که دیتا لو Load می کنی بار بعدی اونها رو filter می کنی (10 سال پیش)
0 0
ایراد مربوط به نوع نوشتنش بود .:| چون بعد از title ، = گذاشته بودم .بر طرف شد. اما این دستور کاری رو که باید انجام نمیده . لیست ویو تغییری نمیکنه. (10 سال پیش)
0 0
دوستان دیگه کسی نظری نداره؟ (10 سال پیش)
0 0
دوستان دیگه کسی نظری نداره؟ شدیدا منتظرما :( (10 سال پیش)
پاسخ به سوال 
Hossein Kurd  10 سال پیش
+1 0

Try It :

        btnSearch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Cursor cursor = G.database.rawQuery("SELECT  * FROM content WHERE title = " + key, null);

                adapter.clear();
                while (cursor.moveToNext()) {
                    Struct item = new Struct();
                    item.title = cursor.getString(cursor.getColumnIndex("title"));
                    item.content = cursor.getString(cursor.getColumnIndex("content"));

                    Log.v("iLOG", "title : " + item.title);
                    Log.v("iLOG", "content : " + item.content);
                    G.lists.add(item); // Changed

                }
                cursor.close();
                adapter.notifyDataSetChanged();

            }
        });

 

پاسخ به سوال 
محمد حسین زاده  10 سال پیش
+5 0

جای تعریف متغیر ها باید اصلاح بشه

btnSearch.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

String key = edtSearch.getText().toString();

G.lists.clear();

Cursor cursor = G.database.rawQuery("SELECT * FROM content WHERE title LIKE '%" + key + "%'", null);

while (cursor.moveToNext())
{
Struct item = new Struct();
item.title = cursor.getString(cursor.getColumnIndex("title"));
item.content = cursor.getString(cursor.getColumnIndex("content"));

G.lists.add(item);
}

cursor.close();

adapter.notifyDataSetChanged();
}
});
0 0
بله درست شد . واقعا ممنونم از لطفتون (10 سال پیش)
+1 0
بله درست شد . واقعا ممنونم از لطفتون . خیلی بهم کمک کردین (10 سال پیش)
0 0
من اومدم همینو بگم که آقا محمد نوشتند ببخشید دیگه دیر رسیدم (10 سال پیش)
0 0
هروقت دکمه ی سرچ زده میشه ، اطلاعاتی مثه تیک مربوط به علاقمندی ها برداشته میشه و درواقع لیست ویو از اول ست میشه و آخرین تغییرات مربوط به favorite ذخیره نمیشه :-؟ (10 سال پیش)
+1 0
اطلاعاتی که تو دیتابیس ذخیره شده باشن قابل بازیابین - ولی اینجا شما فقط title و content رو از دیتابیس واکشی کردی، اطلاعاتی راجع به favorite خونده نشده که قابل نمایش باشه (10 سال پیش)
0 0
favorite که از نوع boolean هست و تو دیتابیس هم ذخیره ش کردم رو چطوری واکشی کنم؟ درواقع راه واکشی داده های از جنس boolean چیه؟ برای دکمه ی علاقه مندی هام برنامه ش رو جوری نوشتم که تیک ش رو به خاطر بسپاره و اگه برنامه باز و بسته شد بازم همون وضعیت بمونه. اما دکمه ی سرچ تغییراتش رو اعمال نمیکنه (10 سال پیش)
0 0
شبیه این میتونی boolean رو از دیتابیس بخونی cursor.getString(cursor.getColumnIndex("donelike")).equals("0") ? Boolean.FALSE : Boolean.TRUE; (9 سال پیش)
پاسخ به سوال 
offset  10 سال پیش
+3 0

سلام دوستان

امیدوارم بحث را تا این جا درست فهمیده باشم و جواب بی راهی ندهم

به نظر من نیاز نیست برای جستجو بر اساس یک فیلد شما هر بار یه کوئری از دیتابیس بزنید بهتر اینه که دو تا ArrayList در کلاس G تعریف کنی

      public static ArrayList<StructCountry> Array     = new ArrayList<StructCountry>();
public static ArrayList<StructCountry> Array_2;

حالا با یه کوئری Array  را از اطلاعات پایگاه پر می کنی  و بعدش Array_2  را از اطلاعات Array پر می کنی . و در نهایت لیست ویو هم با اطلاعات Array_2 پر میشه .

        G.Array = new ArrayList<StructCountry>(G.Array_2);
adapter = new AdapterMartyr(G.Array_2);
lstContent.setAdapter(adapter);
adapter.notifyDataSetChanged();

حالا موقعی که کاربر برو روی plainText در جال وارد کردن عبارت هست سرچی انجام می ده و نتایج را نشون می ده .

         edt1.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
String searchString = edt1.getText().toString().trim();

int textLength = searchString.length();

G.Array_2.clear();
String Rsearch="";
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
کد جالبی بود (10 سال پیش)
0 0
راه بدی نیست ولی سرعت جستجو در کوری گرفتن خیلی سریع تر از حلقه for هستش و قابلیت های اون بیشترم هست. (10 سال پیش)
0 0
خب ، بهرحال موقعه ای که با پایگاه دادارتباط برقرا میشه ، اطلاعات را درون یک حلقه (while ) خوانده و نمایش داده میشه پس فرقی نمیکنه . اما با این کار فقط یک بار ارتباط برقرار میشه و در دفعات بعد از همون ارایه استفاده میشه ، و این مثل یک بافر می مونه که تا پایان برنامه پابرجاست . (10 سال پیش)

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