0

I have a page in viewpager which have a button and a few views which are hidden by default. On click of the button, the views are to be toggled(Show/Hide). My issue is button click is working, but viewpager's height does not changes.

This is the code for adapter:

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

This is the code for modified view pager to make it 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();
}
}

As shown in onClick above, I am calling requestLayout() on pager. The page height gets calculated but the layout is not expanding.

Update: If I swipe to another page(3rd or 4th) then go back to this page, show/hide are working fine.

Not getting why is it not working.

Nitish
  • 3,097
  • 13
  • 45
  • 80

1 Answers1

0

Can you add this code after requestLayout();code line:

invalidate();

if it doesn't work also can you try this:

postInvalidate();

For what these code lines do, you can take a look at this:

What does postInvalidate() do?

Özgür
  • 71
  • 7