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

تعریف OnChildClickListener برای یک CustomView

Abolfazl  9 سال پیش  9 سال پیش
0 0

سلام به همه

من یه کاستوم ویو ساختم که یه ExpandableListView هست که البته از ExpandableListView خود اندرویدم extend نشده، از پایه نوشتمشو از LinearLayout، اکستند کردم.
اینجوری کار میکنه که عنوان لیست و آیکونشو که ست کردم، یه آرایه از string ها که در واقع child های این لیست هستن بهش داده میشه:

//In Activity:

ArrayList<String> data = new ArrayList<>();
data.add("مانیتور");
data.add("کیس");
data.add("صفحه کلید");
data.add("ماوس");

CustomExpandableList customElst = (CustomExpandableList) findViewById(R.id.customElst);
customElst.setChilds(data);
customElst.setTitle("کامپیوتر و تجهیزات جانبی");
customElst.setIcon(R.drawable.ic_cat_computer);

بعد توی این CustomExpandalbeListView توی متد setChilds() میام به تعداد استرینگ های تو آرایه (آرایه data که بهش دادم) یه کاستوم ویو دیگه به اسم CustomExpandalbeListItem توی لیستم اضافه میکنم و نشونش میدم و همینطور یه OnClick روی هر child ست کردم تا عنوانشو توی یه Toast نمایش بدم:
* (تو این کد lnrItemContainer یه LinearLayout هست که بهش child هامو اضافه میکنم)

//In CustomExpandableList

public void setChilds(ArrayList<String> array) {

data = array;
for (int i = 1; i < data.size(); i++) {
final CustomExpandableListItem child = new CustomExpandableListItem(G.context);
child.setItemText(data.get(i));
lnrItemContainer.addView(child);
final int finalI = i;
child.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(G.context, "Item: " + data.get(finalI) + " clicked", Toast.LENGTH_SHORT).show();
}
});
}

}


همه چی عالی کار میکنه، تنها مشکلم تعریف OnClick برای child های این کاستوم ویو هست.
تو خود ExpandalbeListView استاندارد اندروید به این شکل میشه یه onChildClickListener تعریف کرد:

expListView = (ExpandableListView) layout.findViewById(R.id.elst);

expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Toast.makeText(
G.context,
listDataHeader.get(groupPosition)
+ " : "
+ listDataChild.get(
listDataHeader.get(groupPosition)).get(
childPosition), Toast.LENGTH_SHORT)
.show();
return false;
}
});

سؤالم اینه که چجوری متدی مثل setOnChildClickListener واسه کاستوم ویوی خودم تعریف کنم؟


توضیح اضافه:
اصلا طرز کار OnClick رو درست نمیفهمم. تو کدهای خود ExpandableListView اندروید گشتم ببینم setOnChildClickListener() که توی کد بالا هست چیکار میکنه یه عالمه کد و متد بود که override شده بود همینجور دنبالشون کردم 4 تا کلاس بالاتر که یه adapter بود. ناامید شدم برگشتم!
خیلی سرچ زدم به نتیجه‌ای نرسیدم. دیگه خودم اومدم گفتم وقتی توی کاستوم ویوم یه child کلیک شد میام خود اون child (ویوش رو) توی یه فیلد ذخیره میکنم بعد اینو برمیگردونمو تو اکتیویتی روش onClickListener تعریف میکنم! برگردوندم دیدم null بود :(
تعریف onClick واسه ویوهایی که توی کد ساخته و اضافه میشنو هم زیاد سرچ کردمو استفاده کردم به نتیجه‌ای نرسیدم.


واقعیت اینه که این کاستوم ویو من حتی اگه واسش OnClickListener معمولی هم توی اکتیویتی ست کنمو بگم مثلا یه Toast نشون بده اصلا کار نمیکنه! یعنی چه روی عنوان لیست و چه روی child ها کلیک کنم هیچ اتفاقی نمیوفته و Toast هم نشون داده نمیشه.
هرچی بیشتر در مورد کار onClick سرچ کردم که بتونم پیادش کنم گیج تر شدم.
یه جا خوندم گفته بود متد onTouchEvent رو توی کاستوم ویو Override کنم:

@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
return false;
}

این کارو کردم دیدم وقتی مثلا روی یه child کلیک میکنم همونطوری select میمونه. return false رو true کردم دیدم مثل همون اول شد باز false کردم.

 برای این سوال پاسخی وجود ندارد.

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