当前位置: 首页 > 知识库问答 >
问题:

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

翁宏茂
2023-03-14

我要做的是一个ListView。该ListView使用适配器来膨胀只包含一个ViewPager的RelationVelayOut。

public Object instantiateItem(View collection, int position) {}
view.measure(MeasureSpec.makeMeasureSpec(widthMeasureSpecSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightMeasureSpecSize, MeasureSpec.UNSPECIFIED));
((Pager) collection).requestedHeight = view.getMeasuredHeight();

heightMeasureSpecSize实际上是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重新计算,并使用View Pager的第一个子级的MeasurdHeight重新绘制项....

所有这些都是因为wrap_content在ViewPager中被破坏。还有比这更好的方法吗?它似乎效率很低。

共有1个答案

干子瑜
2023-03-14

这是我的解决方案:

    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);
                }
            });

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

 类似资料:
  • 我知道很多文章描述了如何使listView项的展开/折叠动画化,但我就是无法使其工作:-( 我有一个listView,其中每个项目都包含一个隐藏的LinearLayout元素ll(view.gone),我希望使用动画展开/折叠ll。我的问题是--显然--LL的高度可变。ll的高度设置为wrap_content,因为它包含一个描述和一些图像。 我所看到的挑战是,我一开始就把LL的生存能力设定为.消失

  • 我有一块碎片。加载的视图的onCreateView方法上的这个片段有一个ListView(a)(在适配器(a)中填充)。但是,此ListView(A)中有另一个ListView(B)。所以现在,我必须调用适配器(B)来填充这个listview(B)。如果我从片段调用它,我会得到一个空指针,如果我从适配器调用它(a),它不会崩溃,但不会工作。 如何调用另一个适配器中的适配器。 这是片段的代码: 其中

  • 问题内容: 我有一些碎片。每个片段具有在(=挥动之前不可见的)用。 适配器设置为,这会减慢刷卡速度,因为每次创建时都要载入30个列表项,因为正在创建新的片段。 我的问题是,在空闲时刷卡后是否可以设置适配器?或者,还有更好的方法?扩展SlideDrawer时,该列表需要已经加载。 问题答案: 我的问题是,是否可以在Pager闲置时刷卡后设置适配器? 还有就是,你可以在设置监控的滑动手势。然后,您可以

  • Postman支持设置环境变量,并在例如标题中使用它们。 考虑以下示例: 令牌endpoint需要基本标头: 所有其他endpoint都需要承载标头: 目前,我需要完成以下所有步骤,这非常烦人: 调用 从响应中手动复制令牌 转到<code>设置 是否有一种方法可以在每次调用时自动更新环境变量,或者至少始终显示当前环境变量的列表,以便我可以手动更新值,而无需转到

  • 我有一个AsyncTask,在其中我创建了一个ViewPager,当我为它分配了一个适配器时,会出现这个错误 JAVAlang.IllegalStateException:带有适配器com的ViewPager。实例科斯。PagerAdapterZvon@646addd在androidx处需要视图id。碎片应用程序。碎裂翼翅。androidx上的startUpdate(FragmentPagerAd

  • ExpansionTile从ListTile继承,ListTile具有固定的高度。没有瓷砖高度的输入arg。 我尝试用一个硬编码高度将ExpansionTile包装在容器小部件中,但这导致子小部件只占用硬编码高度内的空间。目前,由于小部件中的内容很大,我有一条“Column Overflow by 23 pixels”消息。