【问题标题】:Viewpager page not expanding on button clickViewpager 页面未在按钮单击时展开
【发布时间】:2019-09-11 14:06:41
【问题描述】:

我在 viewpager 中有一个页面,其中有一个按钮和一些默认隐藏的视图。单击按钮后,将切换视图(显示/隐藏)。我的问题是按钮点击有效,但 viewpager 的高度没有改变。

这是适配器的代码:

public class HomeCategoryAdapter extends PagerAdapter implements View.OnClickListener {
private LayoutInflater inflater;
private View lin_view_more, lin_view_less, lin_view_1, lin_view_2, lin_view_3, lin_view_4;
private WrapContentViewPager pager;

public HomeCategoryAdapter(Context context) {
    this.mContext = context;
    this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return 5;
}

@Override
public int getItemPosition(Object object) {
    return super.getItemPosition(object);
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == arg1;
}

@Override
public Object instantiateItem(final ViewGroup container, final int position) {
    pager = (EnhancedWrapContentViewPager) container;
    View itemView = inflater.inflate(R.layout.homescreen_category_adapter, container, false);
    ...

    lin_view_more = itemView.findViewById(R.id.lin_view_more);
    lin_view_more.setOnClickListener(this);

    lin_view_1 = itemView.findViewById(R.id.lin_view_1);
    lin_view_1.setOnClickListener(this);

    lin_view_2 = itemView.findViewById(R.id.lin_view_2);
    lin_view_2.setOnClickListener(this);

    lin_view_3 = itemView.findViewById(R.id.lin_view_3);
    lin_view_3.setOnClickListener(this);

    lin_view_4 = itemView.findViewById(R.id.lin_view_4);
    lin_view_4.setOnClickListener(this);

    switch (position) {
        case 0:
            parent_1.setVisibility(View.VISIBLE);
            parent_2.setVisibility(View.GONE);
            parent_3.setVisibility(View.GONE);
            parent_4.setVisibility(View.GONE);
            parent_5.setVisibility(View.GONE);
            break;

        case 1:
            parent_1.setVisibility(View.GONE);
            parent_2.setVisibility(View.VISIBLE);
            parent_3.setVisibility(View.GONE);
            parent_4.setVisibility(View.GONE);
            parent_5.setVisibility(View.GONE);
            break;

        case 2:
            parent_1.setVisibility(View.GONE);
            parent_2.setVisibility(View.GONE);
            parent_3.setVisibility(View.VISIBLE);
            parent_4.setVisibility(View.GONE);
            parent_5.setVisibility(View.GONE);
            break;

        case 3:
            parent_1.setVisibility(View.GONE);
            parent_2.setVisibility(View.GONE);
            parent_3.setVisibility(View.GONE);
            parent_4.setVisibility(View.VISIBLE);
            parent_5.setVisibility(View.GONE);
            break;

        case 4:
            parent_1.setVisibility(View.GONE);
            parent_2.setVisibility(View.GONE);
            parent_3.setVisibility(View.GONE);
            parent_4.setVisibility(View.GONE);
            parent_5.setVisibility(View.VISIBLE);
            break;
    }
    ...
    ((WrapContentViewPager) container).addView(itemView);
    return itemView;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((WrapContentViewPager) container).removeView((View) object);
}

@Override
public void onClick(View view) {
    switch (view.getId()) {

        case R.id.lin_view_more:
            lin_view_more.setVisibility(View.GONE);
            lin_view_1.setVisibility(View.VISIBLE);
            lin_view_2.setVisibility(View.VISIBLE);
            lin_view_3.setVisibility(View.VISIBLE);
            lin_view_4.setVisibility(View.VISIBLE);
            lin_view_less.setVisibility(View.VISIBLE);
            if (pager != null) {
                pager.measureView();
            }
            break;

        case R.id.lin_view_less:
            lin_view_more.setVisibility(View.VISIBLE);
            lin_view_1.setVisibility(View.GONE);
            lin_view_2.setVisibility(View.GONE);
            lin_view_3.setVisibility(View.GONE);
            lin_view_4.setVisibility(View.GONE);
            lin_view_less.setVisibility(View.GONE);
            if (pager != null) {
                pager.post(new Runnable() {
                    @Override
                    public void run() {
                        pager.measureView();
                    }
                });
            }
            break;
    }
}
}

这是修改视图分页器使其成为 wrap_content 的代码:

public class WrapContentViewPager extends ViewPager {
public WrapContentViewPager (Context context) {
    super(context);
}

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int mode = MeasureSpec.getMode(heightMeasureSpec);
    if (mode == MeasureSpec.UNSPECIFIED || mode == MeasureSpec.AT_MOST) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int height = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int childMeasuredHeight = child.getMeasuredHeight();
            if (childMeasuredHeight > height) {
                Log.debugMessage("WrapContentViewPager", "page height updated");
                height = childMeasuredHeight;
            }
        }
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

public void measureView(){
    requestLayout();
}
}

如上面onClick 所示,我在寻呼机上调用requestLayout()。计算了页面高度,但布局没有扩展。

更新: 如果我滑动到另一个页面(第 3 或第 4)然后返回此页面,显示/隐藏工作正常。

不明白为什么它不起作用。

【问题讨论】:

  • 你能上传你的viewpager的完整代码吗?
  • 请查看第二个代码。其完整的 viewpager 类。此外,适配器的多个部分,我根据位置显示/隐藏。我也更新了该代码。其余的是 findViewByIds 和 onclick,我省略了。
  • @Nitish 你试过用onClick()打电话给viewPager.setCurrentItem(&lt;Item which was clicked&gt;)吗?
  • @GensaGames 展开折叠功能在同一页面上
  • int mode = MeasureSpec.getMode(heightMeasureSpec); 是 =MeasureSpec.EXACTLY 吗?如果是这样,它不会进入if 条件

标签: android android-viewpager


【解决方案1】:

你能在requestLayout();代码行后面加上这段代码吗:

invalidate();

如果它不起作用,你也可以试试这个:

postInvalidate();

关于这些代码行的作用,你可以看看这个:

What does postInvalidate() do?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2019-10-26
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多