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

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

Atlas  10 سال پیش  10 سال پیش
0 0

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

  @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;
0 0
این بخشی از کد هست در کلاس آداپتر مربوط به دکمه علاقمندی ها (10 سال پیش)
+1 0
هربار که ایتمی وارد صفحه میشه ، بر اساس اون چیزی که درون Adapter از قبل ست شده مقدار دهی میشه < آداپتر شما توسط یک آرایه پر شده < شما باید با توجه به position مربوط به Item لیست ویو از درون adapter اون value رو بگیرید و تغییر بدید (10 سال پیش)
0 0
یعنی الان آرایه رو بردارم ؟ (10 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
Atlas  10 سال پیش
0 0


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


 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;


}


}
0 0
???? (10 سال پیش)
+1 0
کد های مربوط به Activity رو بزارید < قسمتی که آریه ایی ساخته میشه از جنس کلاس متغیرهای شما و با اون Adapter مقدار دهی میشه و آداپتر و روی لیست ویو ست میشه (10 سال پیش)
پاسخ به سوال 
Atlas  10 سال پیش
0 0

 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 سال پیش
+1 0

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

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

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

پاسخ به سوال 
Hajhosseini  10 سال پیش
+4 0

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

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

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

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

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