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

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

Reza  8 سال پیش  8 سال پیش
0 0

سلام

    چطور میشه یه ScrollView رو که در یه لایه بالاتر قرار داره و خود اون لایه بالاتر Scroll میشه ، اسکرول کرد ؟ یعنی اگه داخل اون ScrollView کوچک تاچ کردیم همون اسکرول بشه و اگه خارج اون تاچ کردیم ، لایه بزرگتر و کلی اسکرول بشه ؟

اینم یه مثال :

+1 0
همین مگه درست کار نمیکنه ؟ اگه کار نکرد اسکرول کوچیک رو از کناره ها فاصله بدید که با اسکرول بزرگ قاطی نشه. (8 سال پیش)
0 0
نه نمیشه ، پروژه اصلیم دقیقا همونیه که شما میگید ، اسکرول کوچیکه از نظر عرض و ارتفاع یک سوم لایه اصلی ( اسکرول بزرگ ) هست و در وسط صفحه . چه داخل و چه خارج اسکرول کوچک تاچ کنم همیشه لایه اصلی اسکرول میشه . یعنی اون اسکرول کوچک ( متن های زرد ) به هیچ وجه اسکرول نمیشه ! (8 سال پیش)
+1 0
خوب میخواید متن های وسط رو به جای اسکرول از لیست ویو استفاده کنید (8 سال پیش)
+1 0
همین مشکل رو در استک گفتن و جواب دادن که " خود گوگل گفته از لیست ویو داخل اسکرول ویو استفاده نکنید ، با هم تداخل میکنه " . پس یعنی چون اسکرول ویو حالت کلی تر لیست ویو هست ، اینم نمیشه ؟ (8 سال پیش)
+1 0
خودش هیچ راه حلی ارائه نداده ؟ یه کاری هم میشه کرد اونم اینه که وقتی که رویه اسکرول کوچیکه یا تکست ویو ها تاچ میشه شما بگید که اسکرول بزرگه غیر فعال بشه. (8 سال پیش)
+1 0
ممنون ، ببینم چی میشه . (8 سال پیش)
 برای این سوال 1 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
Reza  8 سال پیش
+2 0

 پاسخ صحیح

سلام

فرض کنید کاربر در حال اسکرول یک صفحه " ورود اطلاعات " هست .

    مثلا داره اطلاعات نام ، نام خانوادگی ، سن و ... رو وارد میکنه که میرسه به یک لیست با عنوان نام شهر که میتونه یه 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 داخلی اسکرول میشه .

☻   منبع    ☻


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