ScrollView تو در تو ( یا ListView داخل ScrollView ) حل شد + آموزش







سلام
فرض کنید کاربر در حال اسکرول یک صفحه " ورود اطلاعات " هست .
مثلا داره اطلاعات نام ، نام خانوادگی ، سن و ... رو وارد میکنه که میرسه به یک لیست با عنوان نام شهر که میتونه یه ListView باز باشه یا یه منوی کشویی باز شدنی باشه ( مثل comboBox در VB ) ، که حاوی چند شهر هست .
خب شما در حالت معمولی نمیتونید از ListView در ScrollView یا ScrollView در ScrollView استفاده کنید ، چون اسکرول ها با هم تداخل میکنه و فقط لیست خارجی اسکرول میشه و لیست داخلی اسکرول نمیشه .
این جواب در استک ، جواب منتخب نشد ، ولی چند نفر که استفاده کردن گفتن : " بسیار عالی کار میکنه و این باید به عنوان پاسخ صحیح انتخاب میشد "
کافیه در فایل xml به جای ScrollView خود اندروید از ScrollView کاستوم استفاده کنید ، یعنی به جای <ScrollView ></ScrollView>
از مثلا <com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
استفاده کنید .
public class VerticalScrollview extends ScrollView {
private float downY, moveY;
public VerticalScrollview(Context context) {
super(context);
}
public VerticalScrollview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerticalScrollview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
// ====================================================================================
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
final int action = event.getAction();
float x = event.getRawX();
float y = event.getRawY();
switch (action)
{
case MotionEvent.ACTION_DOWN:
super.onTouchEvent(event);
downY = y;
break;
case MotionEvent.ACTION_MOVE:
moveY = y;
if (getId() == R.id.sv1) {
return false;
} else {
if (Math.abs(moveY - downY) > G.convertDpToPixel(12)) {
return true;
}
return false;
}
case MotionEvent.ACTION_CANCEL:
super.onTouchEvent(event);
break;
case MotionEvent.ACTION_UP:
return false;
default:
break;
}
return false;
}
}
1 - sv1 نام همون ScrollView خارجی هست .
2 - تابع G.convertDpToPixel هم که مشخصه برای تبدیل dipبه pixel استفاده شده . ( خودتون بلدید )
3 - if داخل ACTION_MOVE رو خودم اضافه کردم ، چون اگه عناصر لیست داخلی clickable باشن و از نظر عرضی کل لیست رو پوشش داده باشه ( در حالت ساختن selector ، باید کنترل ها clickable باشن ) ، دیگه تاچ به ScrollView داخلی نمیرسه بلکه به عناصر داخلش میرسه ، برای همین گفتم اگه اسکرول عمودی در ScrollView داخلی بیشتر از 12 dip بود ، تاچ رو از child بدزده و به ScrollView بده ، به این ترتیب ScrollView داخلی اسکرول میشه .
☻ منبع ☻
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .