Делаем высоту ViewPager равной самому высокому элементу в PagerAdapter

У меня есть ViewPager, и я использую его для перелистывания между видами, а не фрагментами. И когда я даю View Pager высоту wrap_content, он ничего не показывает. Поэтому мне пришлось задать ему фиксированную высоту. Но у меня была другая проблема: когда высота элемента больше фиксированной, представление отображается некорректно (и я использую TextView в качестве представления). Итак, что мне делать, чтобы высота ViewPager была равна максимальной.

Я использую PagerAdapter, как показано ниже.

public class IndicatorViewPagerAdapter extends PagerAdapter {
    private Context context;
    public int[] images = {R.drawable.userprofile,R.drawable.userprofile,R.drawable.userprofile,R.drawable.userprofile,R.drawable.userprofile};
    public int[] texts = {R.string.first_text,R.string.second_text,R.string.third_text,R.string.fourth_text,R.string.fifth_text};
    LayoutInflater layoutInflater;
    Typeface typeface;
    String lang;
    public IndicatorViewPagerAdapter(Context context,String lang) {
        this.context = context;
        this.lang=lang;
    }

    @Override
    public int getCount() {
        return texts.length;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view==object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = layoutInflater.inflate(R.layout.feeds_item_layout,null);
        ImageView imageView = view.findViewById(R.id.image);
        TextView textView = view.findViewById(R.id.desc);
        imageView.setImageResource(images[position]);
        String text = context.getResources().getString(texts[position]);
        Log.e("text"," "+text);
        textView.setText(text);
        //ViewPager viewPager = (ViewPager) container;
        if (lang.equals("en")) {
            typeface = ResourcesCompat.getFont(context, R.font.knowledge_regular);
        }
        else {
            typeface = ResourcesCompat.getFont(context, R.font.thesans_plain);
        }
        textView.setTypeface(typeface);
        container.addView(view);


        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        ViewPager viewPager = (ViewPager) container;
        View view = (View) object;
        viewPager.removeView(view);
    }


}

и здесь я использую ViewPager в XML

<LinearLayout
                android:layout_width = "match_parent"
                android:layout_height = "@dimen/_150sdp"
                android:layout_marginTop = "10dp"
                android:background = "#85d7d5d6"
                android:orientation = "horizontal"
                android:padding = "10dp">

                <TextView
                    android:id = "@+id/leftArrowTv"
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_gravity = "center"
                    android:textColor = "@color/arrow_color"
                    android:textSize = "@dimen/_20ssp" />

                <androidx.viewpager.widget.ViewPager
                    android:id = "@+id/viewPager"
                    android:layout_width = "0dp"
                    android:layout_height = "wrap_content"
                    android:layout_weight = "1" />

                <TextView
                    android:id = "@+id/rightArrowTv"
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_gravity = "center"
                    android:textColor = "@color/arrow_color"
                    android:textSize = "@dimen/_20ssp" />

            </LinearLayout>

Кто-нибудь скажет мне, если мой вопрос не ясен

Ahmed Elsayed 30.03.2021 13:44

Попробуйте предоставить родительский вид инфляции следующим образом: View view = layoutInflater.inflate(R.layout.feeds_item_layout, container);

Cheticamp 02.04.2021 16:10

@Cheticamp Я уже добавил эту строку в код, пожалуйста, посмотрите ее еще раз

Ahmed Elsayed 03.04.2021 01:06

Я не вижу этой линии. Я вижу что-то в строке с null в качестве второго аргумента, но не то, что я предлагаю с container в качестве второго аргумента.

Cheticamp 03.04.2021 01:38

@Cheticamp, когда я добавляю контейнер, я получаю эту ошибку lang.IllegalStateException: у указанного дочернего элемента уже есть родитель. Вы должны сначала вызвать removeView () для родительского элемента ребенка.

Ahmed Elsayed 03.04.2021 02:55

Установка false в качестве третьего параметра для inflate(), вероятно, избавит от этой проблемы, но ,. После размышлений, я не думаю, что это твоя проблема.

Cheticamp 03.04.2021 16:07

Почему бы не использовать ScrollView в качестве корневого элемента представления страницы ViewPager

Zain 03.04.2021 18:51

@Zain Я использую NestedScrollView <androidx.core.widget.NestedScrollView android: layout_width = "match_parent" android: layout_height = "0dp" app: layout_constraintTop_toTopOf = "parent" app: layout_constraintBottom_toBottomOf = "parent">

Ahmed Elsayed 03.04.2021 22:54
Этот вам непременно поможет. Я добавил этот код некоторое время назад, и он отлично работал. Однако следует отметить одну вещь: если у вас есть TabLayout, вам нужно ДОБАВИТЬ его высоту к общей сумме, иначе она будет намного короче, чем нужно.
Vucko 05.04.2021 17:36

@Vucko Спасибо, но это не помогает

Ahmed Elsayed 06.04.2021 15:56

Если бы вы могли быть немного более подробными, это помогло бы вам отсортировать этот

Vucko 07.04.2021 10:38

@Vucko, что именно вам нужно из кода?

Ahmed Elsayed 07.04.2021 13:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
12
122
2

Ответы 2

Я не совсем понимаю, почему вы разместили свой код IndicatorViewPagerAdapter.

Код вашего адаптера используется для данных заселять, он не имеет ничего общего с размером представления, которым является ViewPager.

Для меня, вероятно, имеет смысл попробовать настроить окно просмотра и применить логику ручного изменения размера. Поэтому я искал это в stackoverflow, поскольку нашел популярный пост stackoverflow, где вы даже прокомментировали, но, похоже, вы также были смущены тем, как на самом деле его реализовать. Для ясности, я вообще не тестировал это, но, похоже, вас смутила разница между адаптеры и взгляды.

public class WrapContentHeightViewPager extends ViewPager {

    public WrapContentHeightViewPager(Context context) {
        super(context);
    }

    public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int height = 0;
        for(int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if (h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}

Затем измените свой XML на

            <TextView
                android:id = "@+id/leftArrowTv"
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:layout_gravity = "center"
                android:textColor = "@color/arrow_color"
                android:textSize = "@dimen/_20ssp" />

            <my.package.name.WrapContentHeightViewPager
                android:id = "@+id/viewPager"
                android:layout_width = "match_parent"
                android:layout_height = "wrap_content"
                android:fillViewport = "true" />

            <TextView
                android:id = "@+id/rightArrowTv"
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:layout_gravity = "center"
                android:textColor = "@color/arrow_color"
                android:textSize = "@dimen/_20ssp" />

        </LinearLayout>

Когда я использую эту функцию в классе stackoverflow.com/a/20784791/11567530, она делает высоту viewPager равной наивысшему элементу, но я обнаружил проблему, если один из элементов ViewPager является изображением, высота viewPager становится большой из-за изображения, так как я могу решить эту проблему?

Ahmed Elsayed 03.04.2021 23:31

Ты еще там?

Ahmed Elsayed 05.04.2021 16:58

Я попробовал ваш код, и он работает с небольшими изменениями. Вам просто нужно проверить дизайн вашего элемента ViewPager. ViewPager отображается даже с высотой wrap_content. Посмотрите на приведенный ниже код:

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    View view = LayoutInflater.from(context).inflate(R.layout.feeds_item_layout,container, false);
    ...
    container.addView(view);
    return view;
}

когда я попробовал строчку layoutInflater, она не работает. Высота ViewPager примерно 10dp .. все виды в нем обрезаны

Ahmed Elsayed 07.04.2021 13:44

Ты проверил? Вы устанавливаете статическую высоту в LinearLayout, родительский элемент ViewPager - @ dimen / _150sdp

Krishna Vyas 07.04.2021 14:41

как я могу проверить дизайн моего ViewPager?

Ahmed Elsayed 07.04.2021 15:04

Другие вопросы по теме