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

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

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

سلام.

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

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

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

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

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

 

نظرات

Spirit 11 سال پیش
تیتر سوال مناسب نیست ، لطفاً اصلاح کنید

پاسخ‌ها 7

بانوی شرقی 11 سال پیش

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

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 11 سال پیش

تصحیح کنید

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

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

نظرات

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

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

 "SELECT * FROM table where (table.title like'" + '%' + input + "%') "

نظرات

بانوی شرقی 11 سال پیش
بازم حل نشد. وقتی دکمه ی جست و جو رو میزنم، listview رو پر نمیکنه :(
بانوی شرقی 11 سال پیش

کلاس 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();

            }
        });
    }
}

نظرات

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

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

            }
        });

 

نظرات

محمد حسین زاده 11 سال پیش

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

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

نظرات

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

سلام دوستان

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

به نظر من نیاز نیست برای جستجو بر اساس یک فیلد شما هر بار یه کوئری از دیتابیس بزنید بهتر اینه که دو تا 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 ریخته مشه و در نهایت هم در لیست ویو نمایش داده می شود .

نظرات

ATRAS 11 سال پیش
راه بدی نیست ولی سرعت جستجو در کوری گرفتن خیلی سریع تر از حلقه for هستش و قابلیت های اون بیشترم هست.
offset 11 سال پیش
خب ، بهرحال موقعه ای که با پایگاه دادارتباط برقرا میشه ، اطلاعات را درون یک حلقه (while ) خوانده و نمایش داده میشه پس فرقی نمیکنه . اما با این کار فقط یک بار ارتباط برقرار میشه و در دفعات بعد از همون ارایه استفاده میشه ، و این مثل یک بافر می مونه که تا پایان برنامه پابرجاست .

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