View Full Version : customListView ها
majid_7
جمعه 15 آبان 1394, 12:12 عصر
سلام دوستان...
وقت تون بخیر
یه مشکل دارم در رابطه با customListView ها...
من یه لیست دارم که یه دونه ImageView داره همراه با یه CheckBox ...
میخوام وقتی که لیست به کاربر نشون داده میشه و کاربر تعدادی از اونها رو انتخاب میکنه مواردی که انتخاب شده رو داشته باشم...
توی نت هم سرچ کردم منتهی نتونستم از کدهایی که گذاشتن استفاده کنم...
ممنون میشم راهنماییم کنید
hosseinaryai
جمعه 15 آبان 1394, 14:34 عصر
الان مشکلت دقیقن کجاشه ؟ .. کلن لیست ویوو سفارشی نمی تونی طراحی کنی یا مثلن گرفتن چک باکس های انتخاب شده رو نمی تونی پیاده سازی کنی .. ؟
majid_7
جمعه 15 آبان 1394, 16:12 عصر
یه دیالوگ دارم که توش لیست ویویی هست که بصورت custom دوتا شی داره یکی ImageView یکی هم checkBox ....
میخوام کاربر وقتی که لیستم رو نشون میدم (درست کردم و کار میکنه لیستم)...کاربر بتونه چند تا از گزینه ها رو تیک بزنه و اوکی تموم...
میخوام حالا گزینه هایی رو که انتخاب کرده رو داشته باشم تا بعدا بتونم نشون بدم...
hosseinaryai
جمعه 15 آبان 1394, 19:26 عصر
کلیپ زیرو واست آپلود کردم ، دانلود کن .. دقیقن همون چیزیه که می خوای (زبانش انگلیسیه اما کدهاش بسیار واضح و راحت متوجه میشی)
http://s3.picofile.com/file/8221324476/004_List_Views_Selecting_Items.rar.html
majid_7
جمعه 15 آبان 1394, 20:46 عصر
خیلی خیلی ممنون...
مشکلی با زبان ندارم...:لبخندساده:
بازم ممنونم برم ببینم چی میتونم از توش در بیارم... :متفکر:
majid_7
جمعه 15 آبان 1394, 21:39 عصر
ممنون دوست من ... دیدمش منتهی اون چیزی که من میخوام نبود...
من cusotmListView دارم ...این یه لیست ساده رو آموزش میداد که با تغییرات single Choise و multi Choise کار میکرد...
من توی لیستم یه تصویر دارم و یه دونه چک باکس ... که بصورت customadapter هر کدوم از عناصر لیستم یه لایه ی دیگه ست(ببخشید دیگه اینجوری دارم میگم ، میدونم متوجه شدید اما میخوام دقیقا مشکل رو توضیح بدم)...
اطلاعاتم از پایگاه داده خونده میشه و لیست رو پر میکنه ...
بعد از اینکه لیست پر شد به کاربر توی یه دیالوگ نشون داده میشه ...کاربر هر تعداد رو که لازم داشته باشه انتخاب میکنه و بعد از اینکه انتخاب کرد دکمه ی اوکی رو میزنه و تموم
حالا من باید گزینه هایی که انتخاب شده رو داشته باشم (دقیقا اینو میخوام)
مشکلم اینه که نمیتونم اونایی رو که تیک زده کاربر پیدا کنم!!!
اگه روش دیگه ای برای خوندن از پایگاه داده سراغ دارید ممنون میشم بهم بگید... شاید از اول راه رو اشتباه رفتم ولی دقیقا چیزی که لازم دارم همینه ... نمایش یه custom لیست با چک باکس...
hosseinaryai
شنبه 16 آبان 1394, 06:07 صبح
از اول هم متوجه ی منظورت شدم ، با ویدوویی که فرستادم هم می تونی پیاده سازیش کنی ، فرقی نمی کنه لیست ویوت سفارشی باشه یا نه ..
اما خب توی لیست ویوو سفارشیت هم می تونی اونایی که چک خوردن رو بگیری ..
استدلال کار به این صورته ، مطمئنن توی آداپتر سفارشی ای که نوشتی ، چک باکس رو هم معرفی کردی ، یه ArrayList از نوع Stringبصورت سراسری تعریف می کنی ، بعد توی همون آداپتر سفارشیت واسه چک باکس یه رویداد onChecked می نویسی .. توشم یه شرط میذاری ، با این شرط که اگه مثلن چک باکش true بود ، نام خونه ای که چک خورده توی ArrayList سراسریت اضافه بشه ..
اگه بازم نتونستی ، آداپترسفارشی ای که نوشتیو بذازی بهتره ..
majid_7
شنبه 16 آبان 1394, 13:56 عصر
ممنونم از راهنمایی تون دوست عزیز
کاری که گفتید رو انجام دادم(تقریبا جواب گرفتم) منتهی الان یه مشکل دیگه دارم...
فکر کنم مال کلاس Holder باشه ...
من یه مقادیر رنگ رو که دارم از پایگاه داده میخونم و وقتی که اسکرول میکنم لیست با یه سری مقادیر دیگه پر میشه ... مثلا رنگ اول یه سبز بوده وقتی اسکرول میکنم میرم پایین و برمیگردم بالا رنگش شده قهوه ای ... ضمنا کل مقادیر رنگم رو هم از پایگاه داده نمیخونه در حالیکه وقتی از Holder استفاده نمیکنم تمام مقادیر رو میخونه و نشون میده !!!
اینم کدی که استفاده کردم و تقریبا جواب گرفتم... (وقتی اسکرول میکنم رنگها قاتی پاتی میاد)
اما وقتی از Holder استفاده میکنم و لیست رو اسکرول میکنم مقادیر چک باکسی که گذاشتم برداشته میشه !!!
کلاس آداپترم که از ArrayAdapter استفاده کردم بجای BaseAdapter
public class Holder {
CheckBox chk;
ImageView imgV;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
LayoutInflater inflater = (LayoutInflater) ac
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
this.checkedPosition = position;
View vi = convertView;
if (vi == null) {
vi = inflater.inflate(R.layout.select_color, null);
// CheckBox chk = (CheckBox) vi.findViewById(R.id.chkChoose_color);
// chk.setOnCheckedChangeListener(this);
// ImageView imgV = (ImageView)
// vi.findViewById(R.id.imgChoose_Color);
// imgV.setOnClickListener((MainActivity) ac);
// imgV.setColorFilter(Integer.parseInt((items.get(po sition))));
holder = new Holder();
holder.chk = (CheckBox) vi.findViewById(R.id.chkChoose_color);
holder.imgV = (ImageView) vi.findViewById(R.id.imgChoose_Color);
holder.imgV.setColorFilter(Integer.parseInt((items .get(position))));
vi.setTag(holder);
} else {
holder = (Holder) vi.getTag();
Log.d("vi is null", vi.toString());
}
return vi;
// }
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
checkedItem.add(items.get(checkedPosition));
}
}
public static List<String> getCheckedData() {
return checkedItem;
}
کدهایی که کامنت کردم بدون کلاس Holder هست که وقتی استفاده میکنم چک باکس هام بعد از اسکرول برداشته میشه:متفکر:
hosseinaryai
شنبه 16 آبان 1394, 17:50 عصر
اوومممم .. بذار تست کنم بعدن جواب میدم :چشمک:
hosseinaryai
شنبه 16 آبان 1394, 21:23 عصر
خب ببخشید نرسیدم چک کنم .. الان یه نگاه انداختم ، فکر می کنم اگه رویدادو بیرون if , else بنویسی جواب بگیری..
majid_7
شنبه 16 آبان 1394, 21:40 عصر
ممنون اینم تست میکنم ببینم چی میشه :متفکر:
تمومی سورس کدهایی که پیدا کردم یه طورایی شبیه به همینن... رو اعصابمه لعنتی :چشمک:
یه روشهایی دیگه هم هست که از یه کلاس دیگه استفاده میکنه برای ذخیره ی این چک باکس که نمیدونم چجوری از اونا استفاده کنم :افسرده:
فعلا دارم کل نت رو الک میکنم تا ببنیم چی میشه، چیزی پیدا میکنم یا نه!
majid_7
شنبه 16 آبان 1394, 21:48 عصر
خب ببخشید نرسیدم چک کنم .. الان یه نگاه انداختم ، فکر می کنم اگه رویدادو بیرون if , else بنویسی جواب بگیری..
خب تست کردم هیچ فرقی نکرد!
همون نتیجه ی قبلی... با Holder همون نتیجه ی قبلی(نیومدن کل رنگ ها و ...) بدون Holder هم با اسکرول کردن لیست چک باکس ها حذف میشن!!!
:عصبانی++:
#root#
یک شنبه 17 آبان 1394, 07:24 صبح
الان اگه مشکل قاطی شدن رنگ ها موقع بالا پایین رفتن هست به پیشنهاد دارم،
تو همه کدهایی که از ViewHolder استفاده میشه و دیدم و نوشتم توی if , else اولی فقط متغیر ها رو مقدار دهی میکنن،
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
this.checkedPosition = position;
View vi = convertView;
if (vi == null) {
LayoutInflater inflater = (LayoutInflater) ac
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
vi = inflater.inflate(R.layout.select_color, null);
holder = new Holder();
holder.chk = (CheckBox) vi.findViewById(R.id.chkChoose_color);
holder.imgV = (ImageView) vi.findViewById(R.id.imgChoose_Color);
vi.setTag(holder);
} else {
holder = (Holder) vi.getTag();
Log.d("vi is null", vi.toString());
}
if(/** ... **/) {
holder.imgV.setColorFilter(Integer.parseInt((items .get(position))));
} else {
holder.imgV.setColorFilter(...); // other color
}
return vi;
}
majid_7
یک شنبه 17 آبان 1394, 08:28 صبح
الان اگه مشکل قاطی شدن رنگ ها موقع بالا پایین رفتن هست به پیشنهاد دارم،
تو همه کدهایی که از ViewHolder استفاده میشه و دیدم و نوشتم توی if , else اولی فقط متغیر ها رو مقدار دهی میکنن،
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
this.checkedPosition = position;
View vi = convertView;
if (vi == null) {
LayoutInflater inflater = (LayoutInflater) ac
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
vi = inflater.inflate(R.layout.select_color, null);
holder = new Holder();
holder.chk = (CheckBox) vi.findViewById(R.id.chkChoose_color);
holder.imgV = (ImageView) vi.findViewById(R.id.imgChoose_Color);
vi.setTag(holder);
} else {
holder = (Holder) vi.getTag();
Log.d("vi is null", vi.toString());
}
if(/** ... **/) {
holder.imgV.setColorFilter(Integer.parseInt((items .get(position))));
} else {
holder.imgV.setColorFilter(...); // other color
}
return vi;
}
ممنون دوست من...خیلی خیلی ممنون
مشکل رنگم حل شد...:قلب:
حالا دارم با چک باکس ها و اینکه بعد از اسکرول خود ب خود تیک میخورن سروکله میزنم:متفکر:
حس میکنم یه جا یه شرط کم دارم برای اینکه چک کنه آیا چک باکس تیک داره یا نه!!!
hosseinaryai
یک شنبه 17 آبان 1394, 16:21 عصر
اینی که میگم می دونم روش درست و اصولی نیست ولی به جواب میرسی ..
یه ArrayList از اون Integer بصورت سراسری تعریف کن .. هر بار که یه چک باکشو تیک می زنی ، توی رویدادش پوزیشن چک باکس بره توی این ArrayList
بعد توی else قسمت vi .. چک کن ، اگه پوزیشن این چک باکس ، یکی از پوزیشن های داخل ArrayList بود ، تیکدار بشه ، اگه نه که هیچی..
majid_7
یک شنبه 17 آبان 1394, 22:00 عصر
ممنونم جناب hosseinaryai (http://barnamenevis.org/member.php?268244-hosseinaryai) ... بسیار ممنونم.... کد زیر رو پیدا کردم دارم تست میکنم،البته روش پیشنهادی شما به سبک کد نویسیم نزدیکتره :لبخند:
یه قطعه کد پیدا کردم که توی getView ی آداپتر این کدهارو مینویسه...
LinearLayout view = (LinearLayout) convertView;
if (view == null) {
view = (LinearLayout) inflater.inflate(R.layout.select_color,
parent, false);
}
ImageView imgV = (ImageView) view.findViewById(R.id.imgChoose_Color);
imgV.setColorFilter(Integer.parseInt(items.get(pos ition)));
CheckBox cBox = (CheckBox) view.findViewById(R.id.chkChoose_color);
cBox.setTag(Integer.valueOf(position)); // set the tag so we can
// identify the correct row in
// the listener
cBox.setChecked(checked[position]); // set the status as we stored it
cBox.setOnCheckedChangeListener(mListener); // set the listener
return view;
}
OnCheckedChangeListener mListener = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
checked[(Integer) buttonView.getTag()] = isChecked;
}
}
آرایه ی checked از نوع boolean هست....
خب این 2 تا مشکلم رو حل کرده ... نه مقادیرم توی لیست عوض میشه با اسکرول و نه تیک چک باکس ها برداشته میشه...
اما وقتی که میخوام مقادیر چک باکس رو بگیرم فقط یه دونه رو میگیره و همون رو 6 مرتبه تکرار میکنه!!!
و همون گزینه ی اول رو هم فقط میگیره!!! :متفکر:
saeidpsl
دوشنبه 18 آبان 1394, 01:15 صبح
سورس کد (http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=2278541&viewfull=1#post2278541)- ViewHolder رو بنداز دور
majid_7
دوشنبه 18 آبان 1394, 07:54 صبح
سورس کد (http://barnamenevis.org/showthread.php?401729-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF&p=2278541&viewfull=1#post2278541)- ViewHolder رو بنداز دور
ممنونم اما...:ناراحت:
نوش دارویی و بعد از مرگ سهراب آمدی:چشمک:
درستش کردم دیشب تحت این شرایط:عصبانی++::متفکر::عصبان ++::متفکر::ناراحت::لبخند::قهق ه:
#root#
دوشنبه 18 آبان 1394, 08:27 صبح
اینم با ViewHolder دور انداخته شده :لبخند: :
public class ListAdapter extends BaseAdapter {
private List<Item> items;
private LayoutInflater inflater;
public ListAdapter(Context context, List<Item> items) {
this.items = items;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return items.get(position).id;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rootView = convertView;
if (rootView == null) {
rootView = inflater.inflate(R.layout.list_item, parent, false);
ViewHolder holder = new ViewHolder();
holder.box = (CheckBox) rootView.findViewById(R.id.checkBox);
holder.textView = (TextView) rootView.findViewById(R.id.textView);
rootView.setTag(holder);
}
final ViewHolder holder = (ViewHolder) rootView.getTag();
// save current item position
holder.box.setTag(position);
holder.box.setChecked(items.get(position).isChecke d);
holder.textView.setText("Item : " + items.get(position).isChecked);
holder.box.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int pos = (int) holder.box.getTag();
items.get(pos).isChecked = isChecked;
notifyDataSetChanged();
}
});
return rootView;
}
static class ViewHolder {
CheckBox box;
TextView textView;
}
}
saeidpsl
دوشنبه 18 آبان 1394, 09:15 صبح
اینم با ViewHolder دور انداخته شده :لبخند: :
public class ListAdapter extends BaseAdapter {
private List<Item> items;
private LayoutInflater inflater;
public ListAdapter(Context context, List<Item> items) {
this.items = items;
inflater = LayoutInflater.from(context);
}
....................................
}
روش من بهتره کاکا
hosseinaryai
دوشنبه 18 آبان 1394, 09:23 صبح
آخ جون دعوا شد .. من برم تخمه بیارم بیام تماشا :لبخند:
#root#
دوشنبه 18 آبان 1394, 09:34 صبح
روش من بهتره کاکا
اگر منظورتون عدم استفاده از ViewHolder هست، در مستندات (http://developer.android.com/training/improving-layouts/smooth-scrolling.html) و هم توی یکی از ویدئوهایی که خود گوگل داشت ( یادم نیست فکر کنم مال Google IO باشه) توصیه کردن که از ViewHolder استفاده بشه، بخاطر performance بیشتر.
البته نمیخوام نظرمو تحمیل کنم دلیلم رو گفتم :چشمک:
saeidpsl
دوشنبه 18 آبان 1394, 11:48 صبح
آخ جون دعوا شد .. من برم تخمه بیارم بیام تماشا :لبخند:
خخخ
اگر منظورتون عدم استفاده از ViewHolder هست، در مستندات (http://developer.android.com/training/improving-layouts/smooth-scrolling.html) و هم توی یکی از ویدئوهایی که خود گوگل داشت ( یادم نیست فکر کنم مال Google IO باشه) توصیه کردن که از ViewHolder استفاده بشه، بخاطر performance بیشتر.
البته نمیخوام نظرمو تحمیل کنم دلیلم رو گفتم :چشمک:
بله درست امآ من دوست دارم برنامه نویسیم مـتـفـاوت بـاشه. تو این مدت فهمیدم ViewHolder بهتر نبوده در برنامه های پیچیده روش خودم بهتر جواب داده*
majid_7
دوشنبه 18 آبان 1394, 11:59 صبح
خخخ
بله درست امآ من دوست دارم برنامه نویسیم مـتـفـاوت بـاشه. تو این مدت فهمیدم ViewHolder بهتر نبوده در برنامه های پیچیده روش خودم بهتر جواب داده*
فک کنم منم یه روش ابداع کردم...
البته خیلی استاندارد نیست (بهتره بگم اصلا)...
اما کارم رو راه انداخت و درست هم کار میکنه...
البته از Holder استفاده شده ، چون توی تمامی ویدیوهایی آموزشی ای که من دیدم از Holder بعنوان بهینه سازی کد استفاده میشد...(مجبور شدم)
من هم از همین روش استفاده کردم فقط توی اکتیویتی م اومد چک کردم که عناصر تکراری رو توی آرایه م حذف کنه ....
متاسفانه فعلا وقت نکردم چک کنم که کدی که برام فرستادید جناب saeidpsl (http://barnamenevis.org/member.php?127245-saeidpsl) تا ببینم چجوری نوشته شده...چون اکثرا کدهایی که خودمون مینویسیم کامنت گذاری نیست و باید کل کد رو بخونیم تا بفهمیم چه خبره...البته من اینجوری ام (آخر کار کامنت میذارم:لبخند: ) نمیدونم شاید شما اینجوری نباشید...
اما میخونمش چون با سبک کدهای بقیه هم اشنا بشم...واقعا از لطف تون سپاسگذارم :قلب:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.