Сделать высоту 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>

person Ahmed Elsayed    schedule 29.03.2021    source источник
comment
Кто-нибудь скажет мне, если мой вопрос не ясен   -  person Ahmed Elsayed    schedule 30.03.2021
comment
Попробуйте предоставить родительское представление для инфляции следующим образом: View view = layoutInflater.inflate(R.layout.feeds_item_layout, container);   -  person Cheticamp    schedule 02.04.2021
comment
@Cheticamp Я уже добавил эту строку в код, посмотрите еще раз   -  person Ahmed Elsayed    schedule 03.04.2021
comment
Я не вижу этой линии. Я вижу строку, в которой null является вторым аргументом, но не то, что я предлагаю с container в качестве второго аргумента.   -  person Cheticamp    schedule 03.04.2021
comment
@Cheticamp, когда я добавляю контейнер, я получаю эту ошибку lang.IllegalStateException: указанный дочерний элемент уже имеет родителя. Сначала вы должны вызвать removeView() для родителя дочернего элемента.   -  person Ahmed Elsayed    schedule 03.04.2021
comment
Установка false в качестве третьего параметра для inflate(), вероятно, избавит от этой проблемы, но. По размышлению, я не думаю, что это ваша проблема.   -  person Cheticamp    schedule 03.04.2021
comment
Почему бы не использовать ScrollView в качестве корневого элемента представления страницы ViewPager   -  person Zain    schedule 03.04.2021
comment
@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›   -  person Ahmed Elsayed    schedule 03.04.2021
comment
Это обязательно вам поможет. Я добавил этот код некоторое время назад, и он работал как шарм. 1 вещь, которую следует отметить: если у вас есть TabLayout, вам нужно ДОБАВИТЬ его высоту к общему количеству, иначе он будет намного короче, чем должен быть.   -  person Vucko    schedule 05.04.2021
comment
@Vucko Спасибо, но это не помогает   -  person Ahmed Elsayed    schedule 06.04.2021
comment
Если бы вы могли быть немного более сложными, это помогло бы вам разобраться в этом   -  person Vucko    schedule 07.04.2021
comment
@Vucko, что именно тебе нужно от кода?   -  person Ahmed Elsayed    schedule 07.04.2021


Ответы (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>
person Edward van Raak    schedule 03.04.2021
comment
Когда я использую эту функцию в классе stackoverflow.com/a/20784791/11567530, она делает высоту viewPager равной самый высокий элемент, бит, я обнаружил проблему, если один из элементов в ViewPager является изображением, высота viewPager становится большой из-за изображения, так как я могу решить эту проблему? - person Ahmed Elsayed; 03.04.2021
comment
Ты еще там? - person Ahmed Elsayed; 05.04.2021

Я попробовал ваш код, и он работает с небольшим изменением. Вам просто нужно проверить дизайн элемента 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;
}
person Krishna Vyas    schedule 07.04.2021
comment
когда я попробовал строку layoutInflater, она не работает. Высота ViewPager вроде 10dp..все вьюхи в нем обрезаны - person Ahmed Elsayed; 07.04.2021
comment
Ты проверил? Вы устанавливаете статическую высоту в LinearLayout, родитель ViewPager - @dimen/_150sdp - person Krishna Vyas; 07.04.2021
comment
как я могу проверить дизайн моего ViewPager? - person Ahmed Elsayed; 07.04.2021