如何在Viewpager中找到最后一个膨胀的布局

时间:2017-10-06 10:59:46

标签: android android-layout android-viewpager

我正在使用Viewpager根据循环中的一些问题动态扩充我的布局。

这是通过以下方式实现的:

    for (String x : array1) {
                //loop out the number of layouts relative to the number of questions held in x
                View current_layout = LayoutInflater.from(getActivity()).inflate(R.layout.question_fragment, null);

       //use the page adapter to add the layout to the user's view
            pagerAdapter.addView(current_layout);
    }

我的布局上有一个按钮,我只希望根据最终的布局显示这个按钮。

我正在使用以下适配器

public class MainPagerAdapter extends PagerAdapter
{
    // This holds all the currently displayable views, in order from left to right.
    private ArrayList<View> views = new ArrayList<View>();

    //-----------------------------------------------------------------------------
    // Used by ViewPager.  "Object" represents the page; tell the ViewPager where the
    // page should be displayed, from left-to-right.  If the page no longer exists,
    // return POSITION_NONE.
    @Override
    public int getItemPosition (Object object)
    {
        int index = views.indexOf (object);
        if (index == -1)
            return POSITION_NONE;
        else
            return index;
    }

    //-----------------------------------------------------------------------------
    // Used by ViewPager.  Called when ViewPager needs a page to display; it is our job
    // to add the page to the container, which is normally the ViewPager itself.  Since
    // all our pages are persistent, we simply retrieve it from our "views" ArrayList.
    @Override
    public Object instantiateItem (ViewGroup container, int position)
    {
        View v = views.get (position);
        container.addView (v);
        return v;
    }

    //-----------------------------------------------------------------------------
    // Used by ViewPager.  Called when ViewPager no longer needs a page to display; it
    // is our job to remove the page from the container, which is normally the
    // ViewPager itself.  Since all our pages are persistent, we do nothing to the
    // contents of our "views" ArrayList.
    @Override
    public void destroyItem (ViewGroup container, int position, Object object)
    {
        container.removeView (views.get (position));
    }

    //-----------------------------------------------------------------------------
    // Used by ViewPager; can be used by the app as well.
    // Returns the total number of pages that the ViewPage can display.  This must
    // never be 0.
    @Override
    public int getCount ()
    {
        return views.size();
    }

    //-----------------------------------------------------------------------------
    // Used by ViewPager.
    @Override
    public boolean isViewFromObject (View view, Object object)
    {
        return view == object;
    }

    //-----------------------------------------------------------------------------
    // Add "view" to right end of "views".
    // Returns the position of the new view.
    // The app should call this to add pages; not used by ViewPager.
    public int addView (View v)
    {
        return addView (v, views.size());
    }

    //-----------------------------------------------------------------------------
    // Add "view" at "position" to "views".
    // Returns position of new view.
    // The app should call this to add pages; not used by ViewPager.
    public int addView (View v, int position)
    {
        views.add (position, v);
        return position;
    }

    //-----------------------------------------------------------------------------
    // Removes "view" from "views".
    // Retuns position of removed view.
    // The app should call this to remove pages; not used by ViewPager.
    public int removeView (ViewPager pager, View v)
    {
        return removeView (pager, views.indexOf (v));
    }

    //-----------------------------------------------------------------------------
    // Removes the "view" at "position" from "views".
    // Returns position of removed view.
    // The app should call this to remove pages; not used by ViewPager.
    public int removeView (ViewPager pager, int position)
    {
        // ViewPager doesn't have a delete method; the closest is to set the adapter
        // again.  When doing so, it deletes all its views.  Then we can delete the view
        // from the adapter and finally set the adapter to the pager again.  Note
        // that we set the adapter to null before removing the view from "views" - that's
        // because while ViewPager deletes all its views, it will call destroyItem which
        // will, in turn, cause a null pointer ref.
        pager.setAdapter (null);
        views.remove (position);
        pager.setAdapter (this);

        return position;
    }

    //-----------------------------------------------------------------------------
    // Returns the "view" at "position".
    // The app should call this to retrieve a view; not used by ViewPager.
    public View getView (int position)
    {
        return views.get (position);
    }

    // Other relevant methods:

    // finishUpdate - called by the ViewPager - we don't care about what pages the
    // pager is displaying so we don't use this method.
}

我是使用Viewpager的新手,所以不完全确定如何实现这一点 - 我假设需要创建一个自定义方法,但在搜索之后,我找不到能够清楚地解释这是如何实现的内容或者对我的场景很有用。

我知道我可以编写以下内容使按钮在第一个布局上消失,但我对最后一个布局感到困惑。

    //Set button on the last layout in the viewpager

     if (count == pagerAdapter.getCount()+1){

getCurrentPage().findViewById(R.id.btn_submit_question).setVisibility(View.GONE);
    }

我试图用

来实现我的目标
//Set button on the last layout in the viewpager
                if (count != pagerAdapter.getCount()-1){

                    current_layout.findViewById(R.id.btn_submit_question).setVisibility(View.GONE);

                }

但没有运气。

我也有这些方法可用

// Here's what the app should do to add a view to the ViewPager.
    public void addView (View newPage)
    {
        int pageIndex = pagerAdapter.addView (newPage);
        // You might want to make "newPage" the currently displayed page:
        pager.setCurrentItem (pageIndex, true);
    }

    //-----------------------------------------------------------------------------
    // Here's what the app should do to remove a view from the ViewPager.
    public void removeView (View defunctPage)
    {
        int pageIndex = pagerAdapter.removeView (pager, defunctPage);
        // You might want to choose what page to display, if the current page was "defunctPage".
        if (pageIndex == pagerAdapter.getCount())
            pageIndex--;
        pager.setCurrentItem (pageIndex);
    }

    //-----------------------------------------------------------------------------
    // Here's what the app should do to get the currently displayed page.
    public View getCurrentPage ()
    {
        return pagerAdapter.getView (pager.getCurrentItem());
    }

    //-----------------------------------------------------------------------------
    // Here's what the app should do to set the currently displayed page.  "pageToShow" must
    // currently be in the adapter, or this will crash.
    public void setCurrentPage (View pageToShow)
    {
        pager.setCurrentItem (pagerAdapter.getItemPosition (pageToShow), true);
    }

1 个答案:

答案 0 :(得分:0)

我设法通过以下方式解决了这个问题。

感谢Pranav Bhatt&amp;冷火使我指向正确的方向。

//Set button on the last layout in the viewpager

if (pager.getAdapter().getCount()!= array1.length){

 current_layout.findViewById(R.id.btn_submit_question).setVisibility(View.GONE);

   }