مشکل این کد چیـــــه ؟؟!!!
دوستان وقتی تیک علاقمندی در لیست ویو رو میزنم و لیست ویو رو به پایین یا بالا حرکت میدم مقدار چکباکس ریست میشه
@Override
public View getView(final int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
final View rowView = inflater.inflate(R.layout.adapter_note, null, true);
TextView txtSubject = (TextView) rowView.findViewById(R.id.txtsubject);
CheckBox favotite = (CheckBox) rowView.findViewById(R.id.favCheck);
txtSubject.setText(subject[position]);
if(like[position].equals("no")) {
favotite.setChecked(false);
} else if (like[position].equals("yes")) {
favotite.setChecked(true);
}
favotite.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MyDatabase MyDatabase = new MyDatabase(context);
SQLiteDatabase mydb = MyDatabase.getWritableDatabase();
CheckBox favotite = (CheckBox) rowView.findViewById(R.id.favCheck);
if(favotite.isChecked() == true) {
mydb.execSQL("update list set like = 'yes' where id = " + person_ids[position]);
} else {
mydb.execSQL("update list set like = 'no' where id = " + person_ids[position]);
}
mydb.close();
}
});
return rowView;
// کلاس آداپتر
public class AdapterNote extends ArrayAdapter<String> {
private final Activity context;
String subject[];
String like[];
int person_ids[];
public AdapterNote(Activity context,String subject[],String like[],int person_ids[]) {
super(context, R.layout.adapter_note, subject);
this.context = context;
this.subject = subject;
this.like = like;
this.person_ids = person_ids;
}
@Override
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
return true;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
final View rowView = inflater.inflate(R.layout.adapter_note, null, true);
TextView txtSubject = (TextView) rowView.findViewById(R.id.txtsubject);
CheckBox favotite = (CheckBox) rowView.findViewById(R.id.favCheck);
txtSubject.setText(subject[position]);
if(like[position].equals("no")) {
favotite.setChecked(false);
} else if (like[position].equals("yes")) {
favotite.setChecked(true);
}
favotite.setOnClickListener(newOnClickListener(){
@Override
publicvoid onClick(View arg0){
// TODO Auto-generated method stub
MyDatabaseMyDatabase=newMyDatabase(context);
SQLiteDatabase mydb =MyDatabase.getWritableDatabase();
CheckBox favotite =(CheckBox) rowView.findViewById(R.id.favCheck);
if(favotite.isChecked()==true){
mydb.execSQL("update list set like = 'yes' where id = "+ person_ids[position]);
}else{
mydb.execSQL("update list set like = 'no' where id = "+ person_ids[position]);
}
mydb.close();
}
});
return rowView;
}
}
public class ActivityList extends Activity {
private MyDatabase MyDatabase;
public ListView listview;
SQLiteDatabase mydb;
public MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview1);
listview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
switch (position)
{
case 0:
ReadActivity.name = 1;
Intent newActivity = new Intent(ActivityList.this, ReadActivity.class);
startActivity(newActivity);
break;
case 1:
ReadActivity.name = 2;
Intent newActivity2 = new Intent(ActivityList.this, ReadActivity.class);
startActivity(newActivity2);
break;
case 2:
ReadActivity.name = 3;
Intent newActivity3 = new Intent(ActivityList.this, ReadActivity.class);
startActivity(newActivity3);
break;
case 3:
ReadActivity.name = 4;
Intent newActivity4 = new Intent(ActivityList.this, ReadActivity.class);
startActivity(newActivity4);
break;
case 4:
ReadActivity.name = 5;
Intent newActivity5 = new Intent(ActivityList.this, ReadActivity.class);
startActivity(newActivity5);
break;
case 5:
ReadActivity.name = 6;
Intent newActivity6 = new Intent(ActivityList.this, ReadActivity.class);
startActivity(newActivity6);
break;
}
}
});
// مقداردهی از دیتابیس
MyDatabase = new MyDatabase(this);
mydb = MyDatabase.getReadableDatabase();
//mydb.execSQL("UPDATE id,name,like from list", null);
Cursor c = mydb.rawQuery("select id,name,like from list", null);
int person_ids[] = new int[c.getCount()];
String subject[] = new String[c.getCount()];
String like[] = new String[c.getCount()];
int i = 0;
if(c.moveToFirst()) {
do {
person_ids[i] = c.getInt(0);
subject[i] = c.getString(1);
like[i] = c.getString(2);
i++;
} while (c.moveToNext());
c.close();
mydb.close();
}
AdapterNote adapter = new AdapterNote(this, subject, like, person_ids);
lstContent.setAdapter(adapter);
}
}
کد های شما اصلا شبیه به آموزش های استاد نیست < چرا AdapterNote شما متد fill نداره ! متد fill کار setOnItemClickListener رو به نحو بهتری انجام میده < پیشنهاد میکنم آموزش های استاد در مورد لیست ویو رو ببینید < با این نحوه کد نویسی در آینده به مشکل برمیخورید <
adapter رو استاتیک کنید تا در کلاس AdapterNote قابل دسترسی باشه
حالا توی متد fill با استفاده از position از درون ( پوزیشن! )AdapterNote.getindex کنید < و مقدار like و یا بقیه رو بگیرید و تغییر بدید <
دوست عزیز کدی که شما نوشتی اصلا تمیز نیست.
گرفتن دیتا از دیتابیس رو در یک کلاس دیگه انجام بدید.
ست کردن آداپتر رو بیارید بالای لیستنرش.
به جای استفاده از چند آرایه، یک object بسازید و از اون یک ArrayList بگیرید. این کار خیلی کدهاتون رو تمیز میکنه.
حالا جواب سوالتون:
دلیل بوجود آمدن این مشکل: زمانی که روی یک آیتم کلیک میشه، شما مقادیری که به لیست ویو پاس دادی رو تغییر نمیدی. تنها کاری که داری میکنی، ارسال اون مقادیر به صورت کاملا غیر اصولی به یک اکتیویتی دیگره.
برای حل این مشکل:
توی آداپتر، یک متد به نام setFavorites قرار بدید، توش کد زیر رو بنویسید:
public setFavorites(int position){
myArrayList.get(position).like = true;
notifyDataSetChanged();
}
یک راه دیگه این که توی اکتیویتی این کارو بکنید: بدین صورت که همون ArrayList رو که به آداپتر پاس دادید رو تغییر بدید، بعد adapter.notifyDataSetChanged() رو بزنید.
برای ارسال مقادیر به اکتیویتی جدید هم از putExtra استفاده کنید، اصلا نباید از یک متغیر استاتیک استفاده کنید. تازه شما اول متغیرت رو مقدار دهی میکنی، بعد میای یک instance از اکتیویتی میسازی!
در مورد listView.setOnItemClickListener هم باید بگم، این روش اصولی تر از استفاده از کلیک در خود آداپتر هست، فقط فقط زمانی که شما بخوای با کلیل روی آیتم لیست ویوت، فقط یک action داشته باشی، ولی اگر بخوای چند کار رو انجام بدی، روش مهندس آقاجانی راه درسته.
متد fill هم فقط جهت تمیز شدن کد استفاده میشه، ولی در صورتی که کار خاصی در این قسمت انجام نشه، باید حذف بشه.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .