گاهی لازم است که یک listview را در یک scrollview قرار دهیم. گرچه این روش توصیه نمیشود ولی گاهی اوقات به ناچار مجبور به استفاده از این روش میشویم. از آنجایی که دو کامپوننت یاد شده هردو قابلیت اسکرول خوردن عمودی را دارا هستند لذا به حالت عادی، اسکرول شدن کامپوننت بچه(listView) در اسکرول پدر(scrollView) ماسکه میشود. در ادامه راه کارهایی ارائه خواهد شد....
listview in scrollview android

گاهی لازم است که یک listview را در یک scrollview قرار دهیم. گرچه این روش توصیه نمیشود ولی گاهی اوقات به ناچار مجبور به استفاده از این روش میشویم. از آنجایی که دو کامپوننت یاد شده هردو قابلیت اسکرول خوردن عمودی را دارا هستند لذا به حالت عادی، اسکرول شدن کامپوننت بچه(listView) در اسکرول پدر(scrollView) ماسکه میشود. در ادامه راه کارهایی ارائه خواهد شد....

روش ابتدایی این است که ارتفاع listView را به اندازه مجموع بچه های listview در آوریم. به عبارت ساده تر ارتفاع تمام فرزندان listview را با هم جمع بزنیم و به عنوان ارتفاع listview قرار دهیم. البته باید به این مقدار margin های بالا و پایین و اندازه divider لیست را نیز اضافه کنیم. به این ترتیب listview در داخل اسکرول ویو به اندازه واقعی خود دیده میشود و شما میتوانید با اسکرول کردن scrollview همه فرزندان آن را مشاهده نمایید.

برای این منظور متدی را در نظر گرفته ایم که میتوان با پاس دادن لیست ویو به آن اندازه آن را به حالت مطلوب رساند.

 

public static void setListViewHeightBasedOnChildren2(ListView listView, Context context) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            if (listItem instanceof ViewGroup) {
                listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            }
            listItem.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Display display = wm.getDefaultDisplay();
            int screenWidth = display.getWidth(); // deprecated
            int height = display.getHeight(); // deprecated

            int listViewWidth = screenWidth - 10 - 10;
            int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth, MeasureSpec.AT_MOST);
            listItem.measure(widthSpec, 0);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
    }

روش کار کد بدین شکل است که از لیست ویو داده شده به متد، تمام فرزندان آن را در قالب یک view بدست می آورد و ارتفاع هرکدام از آنها را با توجه به میزان عرض لیست ویو بدست می آورد. و آنها را با هم جمع میکند. همچنین به ازای تمام فرزندان لیست اندازه divider را با انها جمع میکند و در آخر در قالب یک layoutparam به لیست ویو اندازه درست را میدهد.

در قسمت بعد با یک روش دیگر که بهینه تر خواهد بود آشنا خواهیم شد...

 

دیدگاه‌ها

تصویر مولوی

مولوی (تایید نشده)

باسلام ممنون از مطلب خوبتون بی زحمت میتونید سورس این برنامه را هم بگزارید یا برایم ایمیل فرمایید
با سپاس فرارن

افزودن نظر جدید