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

مشکل CursorAdapter در لیست ویو

حامد  12 سال پیش  12 سال پیش
+2 0

سلام

استاد در درس آموزش لیست ویو گفت که اگر در checkbox از onclicklistener استفاده بشه با اسکرول کردن تیک checkbox برداشته نمیشه.

من با استفاده از cursorAdapter اطلاعات یک دیتابیس آماده را در لیست میخونم که یه checkbox برای افزودن به علاقه مندی وجود داره.
وقتی روی چک باکس تیک میزنی خوب مقدار yes به دیتابیس افزوده میشه و اون آیتم به علاقه مندی ها افزوده میشه.
اما با اسکرول کردن تیک چک باکس برداشته میشه و البته با دوباره وارد اون اکتیویتی شدن علاقه مندی ها نشان داده میشه.
از onclicklistener هم استفاده میکنم فرقی نمیکنه.

اگر از آرایه ها استفاده کنی مشکلی پیش نمیاد ولی اگه بخوای cursorAdapter استفاده کنم چطور باید این قضیه را درست کنم

کد adapter در زیر قرار دادم
عکس برنامه :

0 0
حامد ببین جوابی واسه این سوالم داری !؟ ، لینک ، میخوام آیتم ها داینامیک لود بشه ، ولی نمیدونم وقتی اسکرول کجا بود لود کنم ! (12 سال پیش)
 برای این سوال 8 پاسخ وجود دارد.
پاسخ به سوال 
حامد  12 سال پیش
0 0

این هم کد CursorAdapter :

public class MyAdapter extends CursorAdapter {
     
    Context b;   
    LayoutInflater inflater;
    @SuppressWarnings("deprecation")
    public MyAdapter(Context context, Cursor c) {
        super(context, c);
        inflater = LayoutInflater.from(context);
        b= (Context) context;
    }
  
    @SuppressWarnings("unused")
    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        // TODO Auto-generated method stub
         
        TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
        TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);
          
        tv1.setText(cursor.getString(2));
        tv2.setText(cursor.getString(3));
         
        final int pos = cursor.getPosition();
         
        final CheckBox repeatChkBx = (CheckBox)view.findViewById(R.id.favorite_check);
     
        String me = cursor.getString(cursor.getColumnIndex("like"));
         
        if (me.equals("yes")) {
            repeatChkBx.setChecked(true);
        } else {
            repeatChkBx.setChecked(false);
        }
         
        repeatChkBx.setOnClickListener(new OnClickListener() {
             
            @Override
            public void onClick(View view) {
                MyDatabase MyDatabase = new MyDatabase(b);
                SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
                cursor.moveToPosition(pos);
                 
                if (repeatChkBx.isChecked()) {                   
                    mydb.execSQL("update list set like = 'yes' where id = " + cursor.getString(1));
                 
                }else{
                    mydb.execSQL("update list set like = 'no' where id = " + cursor.getString(1));           
                 
                }
            }
        });
         
        }
          
        protected Context getActivity() {
            // TODO Auto-generated method stub
            return null;
        }
         
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            return inflater.inflate(R.layout.item, parent, false);
        }
    }
پاسخ به سوال 
حامد  12 سال پیش
0 0

اگر از آرایه ها استفاده بشه قسمتی که دیتابیس را آپدیت میکنیم ستون علاقه مندی ها را برابر مقدار داده میکنیم و درست میشه

ولی تو cursoradapter این طور نیست

                if(favotite.isChecked()) {
                    mydb.execSQL("update list set like = 'yes' where id = " + ids[position]);
                    likes[position] = "yes";
                } else {
                    mydb.execSQL("update list set like = 'no' where id = " + ids[position]);
                    likes[position] = "no";
                }    
پاسخ به سوال 
مجتبی یگانه  12 سال پیش
+2 0

حامد جان شما خودت استادی ، ولی گفتم یه یاد  آوری بکنم

1 - مقدار ثبت شده در دیتابیس رو چک کنید ، حتما ثبت شده باشه
2- آرایه ای که ست شده رو هم تغییر بدید ! ، یعنی فقط تغییر رو دیتابیس نباشه
3- وقتی که متد Fill فراخوانی میشه ، مقدار چک باکس رو هم از آرایه ست کنید (من با cursor adapter کار نکردم ، احتمالا یه تابه مشابهی داشته باشه دیگه :| )

پاسخ به سوال 
حامد  12 سال پیش
0 0

فکر کنم تابع new view باشه که اونجا هم مقدار چک باکس را چک کردم نشد

من پروژه را آپلود کردم که اگر کسی خواست پروژه را هم ببینه :

لینک

0 0
یه سوال؟ درباره بخش دیتابیسشه! این روشت بدون کپی کردن دیتابیس روی sd اطلاعات رو ذخیره میکنه؟ خودش کپی میگیره؟ کجا ذخیره میکنه؟ تا اونجایی که من خوندم برای تغییرات روی دیتابیس حتما باید اونو روی sd کپی کنیم اما روش تو انگار چیز دیگه ایه! (12 سال پیش)
0 0
همه کارها را اون لایبری انجام میده ... ازش استفاده نکنی ضرر کردی .... راحت هم میتونی دیتابیست را آپدیت کنی (12 سال پیش)
0 0
اینم لینک توضیحات این لایبری : (12 سال پیش)
0 0
لینک (12 سال پیش)
0 0
آهان یه کتابخونه ای اضافه کردی. داشتم شاخ در میاوردم D: . کتابخونه جالبیه. دمت گرم بابت کتابخونه . البته برای آپدیت اتوماتیک دیتابیسش قبلا مجبور شده بودم یه روشی ابداع کنم :| . میگم حالا این دیتابیس رو توی چه آدرسی کپی میکنه؟ قابل تنظیمه؟ (12 سال پیش)
پاسخ به سوال 
sadeghbarout  12 سال پیش
+1 0

اشکال برنامه ات رو پیدا کردم ولی راه حلشو نمیدونم. آخه این آداپترت رو یه جور خاصی نوشتی و مثل اونی که باهاش کار میکنم نیست

مشکل کارت اینه که موقع چک شرط این بخش :

  if (repeatChkBx.isChecked()) {
mydb.execSQL("update list set like = 'yes' where id = " + Integer.parseInt(cursor.getString(1)));

} else {
mydb.execSQL("update list set like = 'no' where id = " + Integer.parseInt(cursor.getString(1)));

}

مقدار repeatChBx به اون الوار آخری اشاره میکنه نه اون الواری که کلیک میشه.

شما اگه اون الوار آخرو کلیک کنی میبینی که مقدارش yes میشه و باقی میمونه

اما میگم به خاطر نوع خاص آداپترت من نمیدونم باید چطور مشکلو رفع کنی

امیدوارم کمکی کرده باشم

0 0
این مشکل را با گرفتن position حل کردم ... (12 سال پیش)
0 0
این کد بالا اشتباهه و دیتابیس را آپدیت نمیکنه ..... پروژه جدید را آپلود کردم اما هنوز این مشکل چک باکس مونده (12 سال پیش)
پاسخ به سوال 
حامد  12 سال پیش
0 0

لینک پروژه جدید :

http://upir.ir/1393.2/listview-custom.rar

کد myadapter :

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
       
        TextView tv1 = (TextView)view.findViewById(R.id.txt_name);
        TextView tv2 = (TextView)view.findViewById(R.id.txt_numer);
         
        tv1.setText(cursor.getString(2));
        tv2.setText(cursor.getString(3));
       
        final int pos = cursor.getPosition();
       
        final CheckBox repeatChkBx = (CheckBox)view.findViewById(R.id.favorite_check);
       
        String likes = cursor.getString(cursor.getColumnIndex("like"));
       
        if (likes.equals("yes")) {
            repeatChkBx.setChecked(true);
        } else {
            repeatChkBx.setChecked(false);
        }
       
        repeatChkBx.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View view) {
                MyDatabase mydatabase = new MyDatabase(b);
                SQLiteDatabase mydb = mydatabase.getWritableDatabase();
                cursor.moveToPosition(pos);
               
                if (repeatChkBx.isChecked()) {
                    ContentValues cv = new ContentValues();
                    cv.put("like", "yes");
                    mydb.update("list", cv, "id ="+cursor.getString(1), null);
                } else {
                    ContentValues cv = new ContentValues();
                    cv.put("like", "no");
                    mydb.update("list", cv, "id ="+cursor.getString(1), null);
                }
                mydb.close();
            }
        });

        }
پاسخ به سوال 
sadeghbarout  12 سال پیش
+1 0

ماشالا خودت حرفه ای و احتمالا خودت هم متوجه مشکل شدی ولی خوب منم میگم شاید کمکی بشه.

مشکل از اون cursor ه . توی بخش onclick دائم دیتابیس باز و بسته میشه و مشکلی نیست اما اون cursor که از پارامتر های bindView ه  چون یه بار اول برنامه باز شده و تا آخر برنامه هم بسته نمیشه ، مقادیر جدید دیتابیس رو دریافت نمیکنه . فکر کنم یا باید راهی پیدا کنی که اون cursor رو آپدیت کنه ( خودم نمیدونم اون bindView ه از کجا فراخونی میشه) یا باید  از یه آرایه برای روشن و خاموش کردن شون  استفاده کنی . یعنی هم تو دیتابیس ذخیره کنی و هم اونجا که likes رو میخونی، به جای cursor، از آرایه پرش کنی.

البته چون کلاست از CursorAdapter اکستند شده ، نمیذاره ArrayList تعریف کنی. به جاش فکر کنم بشه آرایه رو توی کلاس main تعریف کنی و با دو تا متد set و get مقداردهیش کنی (البته مطمئن نیستم اجازه دسترسی بده به خاطر اینکه باید متد استاتیک باشه و ...)

یا اینکه از آرایه استاتیک استفاده کنی.

ایشالا فردا یه تلاشی روش میکنم ببینم چکارش میشه کرد :)


ویرایش : الان فرداست D:

برای ستاره ها به نظرم کارت با cursorAdapter راه نمیوفتهیا خیلی سختتر بشه. فکر کنم بهتره از همون ArrayAdapter استفاده کنی. 

0 0
واقعا دمت گرم بابت اینکه دنبالش بودی .... من قبلا با arrayadapter برای خودم درستش کرده بودم .. ولی میخواستم با cursorAdapter هم درست بشه ... باهاش سر و کله میزنم اگه درست شد جوابو تو همین پست میزارم (12 سال پیش)
پاسخ به سوال 
حامد  12 سال پیش
0 0

تو stack یه نفر جواب ساده داده و بقیه تایید کردند که لینکش را گذاشتم
یه نگاه بندازین ببینین دقیقا چی میگه؟
من که نتونستم ازش استفاده کنم
http://stackoverflow.com/questions/1...oradapter?rq=1

0 0
یه سوال دیگه فرستادم و به لینک بالا اشاره کردم و گفتم که برای من درست نمیشه دو نفر کامنت گذاشتند میگن که اون از cursorAdapter استفاده نمیکنه داره از CustomAdapter یا همون ArrayAdapter استفاده میکنه ...... ...... من که فکر نمیکنم اینطور باشه (12 سال پیش)
0 0
این مشکل که آخر حل نشد .... اگه کسی تونست حل کنه مارو بی خبر نذاره .... استاد هم نمیاد سوال مارو جواب بده (12 سال پیش)
0 0
بعد جستجوی زیاد 2 راه برای update کردن cursor پیدا کردم. ولی هردوشون یه مشکل رو بوجود میارن و اون اینه که بعد از تیک زدن هر چک باکس یه بار باید لیست رو بالا پایین کنی تا بتونی کلیک بعدی رو بکنی. درواقع فکر کنم باید یه جورایی لیست ویو رفرش بشه. حالا یه راه آپدیت کردنو میگم تا بعد برای این مشکل یه راهی پیدا کنیم. بعد از دستور آپدیت کردن دیتابیست این دستورو بنویس : cursor.requery(); (12 سال پیش)

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