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

مشکل این کد چیـــــه ؟؟!!!

مدیریت گفتگو
Atlas 10 سال پیش
آخرین تغییر: 10 سال پیش

دوستان وقتی تیک علاقمندی در لیست ویو رو میزنم و لیست ویو رو به پایین یا بالا حرکت میدم مقدار چکباکس ریست میشه

  @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;

نظرات

Atlas 10 سال پیش
این بخشی از کد هست در کلاس آداپتر مربوط به دکمه علاقمندی ها
Criss 10 سال پیش
هربار که ایتمی وارد صفحه میشه ، بر اساس اون چیزی که درون Adapter از قبل ست شده مقدار دهی میشه < آداپتر شما توسط یک آرایه پر شده < شما باید با توجه به position مربوط به Item لیست ویو از درون adapter اون value رو بگیرید و تغییر بدید
Atlas 10 سال پیش
یعنی الان آرایه رو بردارم ؟

پاسخ‌ها 4

Atlas 10 سال پیش


// کلاس آداپتر


 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;


}


}

نظرات

Criss 10 سال پیش
کد های مربوط به Activity رو بزارید < قسمتی که آریه ایی ساخته میشه از جنس کلاس متغیرهای شما و با اون Adapter مقدار دهی میشه و آداپتر و روی لیست ویو ست میشه
Atlas 10 سال پیش

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

}

نظرات

Criss 10 سال پیش

کد های شما اصلا شبیه به آموزش های استاد نیست < چرا AdapterNote شما متد fill نداره ! متد fill کار setOnItemClickListener رو به نحو بهتری انجام میده < پیشنهاد میکنم آموزش های استاد در مورد لیست ویو رو ببینید < با این نحوه کد نویسی در آینده به مشکل برمیخورید <

adapter رو استاتیک کنید تا در کلاس AdapterNote قابل دسترسی باشه

حالا توی متد fill با استفاده از position از درون ( پوزیشن! )AdapterNote.getindex کنید < و مقدار like و یا بقیه رو بگیرید و تغییر بدید <

نظرات

Hajhosseini 10 سال پیش

دوست عزیز کدی که شما نوشتی اصلا تمیز نیست.
گرفتن دیتا از دیتابیس رو در یک کلاس دیگه انجام بدید.
ست کردن آداپتر رو بیارید بالای لیستنرش.
به جای استفاده از چند آرایه، یک object بسازید و از اون یک ArrayList بگیرید. این کار خیلی کدهاتون رو تمیز میکنه.
حالا جواب سوالتون:
دلیل بوجود آمدن این مشکل: زمانی که روی یک آیتم کلیک میشه، شما مقادیری که به لیست ویو پاس دادی رو تغییر نمیدی. تنها کاری که داری میکنی، ارسال اون مقادیر به صورت کاملا غیر اصولی به یک اکتیویتی دیگره.
برای حل این مشکل:
توی آداپتر، یک متد به نام setFavorites قرار بدید، توش کد زیر رو بنویسید:

 public setFavorites(int position){
myArrayList.get(position).like = true;
notifyDataSetChanged();
}

یک راه دیگه این که توی اکتیویتی این کارو بکنید: بدین صورت که همون ArrayList رو که به آداپتر پاس دادید رو تغییر بدید، بعد adapter.notifyDataSetChanged() رو بزنید.
برای ارسال مقادیر به اکتیویتی جدید هم از putExtra استفاده کنید، اصلا نباید از یک متغیر استاتیک استفاده کنید. تازه شما اول متغیرت رو مقدار دهی میکنی، بعد میای یک instance از اکتیویتی میسازی! 
در مورد listView.setOnItemClickListener هم باید بگم، این روش اصولی تر از استفاده از کلیک در خود آداپتر هست، فقط فقط زمانی که شما بخوای با کلیل روی آیتم لیست ویوت، فقط یک action داشته باشی، ولی اگر بخوای چند کار رو انجام بدی، روش مهندس آقاجانی راه درسته.
متد fill هم فقط جهت تمیز شدن کد استفاده میشه، ولی در صورتی که کار خاصی در این قسمت انجام نشه، باید حذف بشه.

نظرات

Atlas 10 سال پیش
این سورسو من از جایی دیگه ای گرفتم از فروم همینجا بعد کمی گسترشش دادم رو برنامه اصلیم ولی بعد متوجه شدم که این مشکل توش هست من بیچاره هم که شبا فقط وقت دارم یکم حوصلمو سر برده حالا با توجه به راهنماییتون یک دست و پنجه ای نرم میکنیم ببینم چی میشه بازم ممنون از شما و آقای Criss
محمد 10 سال پیش
آقای حاج حسینی منظورتون از "فقط یک action داشته باشی" دقیقا چیه؟
Hajhosseini 10 سال پیش
یک اکشن داشته باشه، به این معنی هست که با کلیک روی یک آیتم از لیست، فقط یک کار انجام بشه. مثلا در کافه بازار، روی هر قسمت از عکس، متن، متن رایگان/پولی در آیتم ها کلیک کنید(در صفحه اصلی)، یک فرگمنت براتون باز میشه. ولی در لیست هایی که در هر آیتم میتونید عملیاتی مانند Like,Share,Delete,Add و ... رو انجام بدید، یا باید یک کنترلر براش بنویسید، یا باید توی همون آداپتر برای ویوهای هر آیتم (الوار) یک onClickListener بنویسید. راه های دیگه ای هم هست که یکم پیچیده تر میشه، ولی راه اصولیش، همین 2 راه بستگی به شرایط استفاده هست.

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