gpt4 book ai didi

android - ListView 中的 ViewPager - 动态测量高度(WRAP_CONTENT 在适配器中膨胀)

转载 作者:太空狗 更新时间:2023-10-29 14:25:37 29 4
gpt4 key购买 nike

我正在进行的是一个 ListView。该 ListView 使用一个适配器来扩充仅包含一个 ViewPager 的 RelativeLayout。

在适配器的 getView 中,为 ViewPager 实例化自定义 PagerAdapter,并为 ViewPager 调用 .setAdapter。在调用 setAdapter 之后,我立即执行返回行或返回 View ;这结束了 ListView 中该适配器的 getView 方法。

在我实现的PagerAdapter中

public Object instantiateItem(View collection, int position) {}

这基本上就是为 Pager Adapter 设置 subview (页面)的内容。它会膨胀和设置所有 subview ,然后将 View 添加到集合中。

我认为问题在于在行中完成返回后,PagerAdapter 仍未完成子项的设置,因此 ListView 认为 ViewPager 为空并以这种方式将其绘制到屏幕上。我所做的基本上是我认为的 hack。

我尝试使用如下方法测量 instantiateItem 中的第一个 subview :

view.measure(MeasureSpec.makeMeasureSpec(widthMeasureSpecSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightMeasureSpecSize, MeasureSpec.UNSPECIFIED));
((Pager) collection).requestedHeight = view.getMeasuredHeight();

heightMeasureSpecSize 值实际上是一个公共(public)属性,由 listView 适配器在调用 .setAdapter 之前设置((Pager) collection).requestedHeight 是我在扩展 ViewPager 本身时创建的另一个属性。在为其设置值之前,它默认为 100。然后我像这样覆盖了 onMeasure 方法:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(requestedHeight, View.MeasureSpec.AT_MOST));
}

使用所有这些代码,当我运行应用程序时,每当在 ViewPager 上调用 onMeasure 时,ListView 似乎将 ViewPager 添加到列表中 100 然后使用 onMeasure 重新计算并使用 measuredHeight 重绘项目View Pager 的第一个 child ....

所有这一切都是因为 wrap_content 在 ViewPager 中被破坏了。有没有比这样做更好的方法?这似乎非常低效。

最佳答案

这是我的解决方案:

    ViewTreeObserver viewTreeObserver = mViewPager.getViewTreeObserver();
viewTreeObserver
.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override
public void onGlobalLayout() {

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);

int viewPagerWidth = mViewPager.getWidth();
float viewPagerHeight = (float) (viewPagerWidth * FEATURED_IMAGE_RATIO);

layoutParams.width = viewPagerWidth;
layoutParams.height = (int) viewPagerHeight;

mViewPager.setLayoutParams(layoutParams);
mViewPager.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
}
});

我测量然后调整高度。希望对您有所帮助。

关于android - ListView 中的 ViewPager - 动态测量高度(WRAP_CONTENT 在适配器中膨胀),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12907489/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com