ViewPager中的片段在滑动时消失

时间:2014-02-11 01:29:08

标签: android-listview android-fragments android-viewpager

上下文

我有一个包含NewsFragment的HomeActivity。 NewsFragment包含一个ListView,用于在列表中显示新闻项。我有一个ViewPager作为标题视图添加到ListView。此ViewPager显示为列表的标题,并包含DateFragment以显示日期。用户第一次打开HomeActivity时,我希望“TODAY”成为日期。当用户向左滑动DateFragment时,我希望日期文本显示为“TOMORROW”。再次滑动它应该显示后天。类似地,当用户向另一个方向滑动时,我想显示“昨天”,前天等等.ViewPager应该支持在两个方向上无限地(或非常大的数字)滑动。

以下是它们的嵌套方式 - http://tinypic.com/r/31623qw/8。 (我没有发布图像的声誉,但这个图对于理解这个问题非常有用)。

问题 为简单起见,我将片段的索引显示为日期。当我第一次打开应用程序时,我看到“Date:0”显示为DateFragment中的日期。当我向左侧滑动片段(转到第二天)时,我可以看到下一个片段显示“Date:1”,但几乎立即显示片段消失。片段消失后,没有任何内容再次出现,我只看到一个空容器。我可以滑动以恢复“Date:0”片段,但我看不到任何其他片段。 (我正在使用Antony T.的 - Infinite View Pager - https://github.com/antonyt/InfiniteViewPager

血腥细节

我有一个包含NewsFragment的HomeActivity。 NewsFragment包含一个ListView,用于将新闻项目显示为列表。这是NewsFragment的layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

</LinearLayout>

我有一个ViewPager,它被动态添加为此列表的标题。所以在NewsFragment中,我首先初始化ListView:

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState)
{
   View view = inflater.inflate(R.layout.home_news_fragment, container, false);
   list = (ListView) view.findViewById(android.R.id.list);
   emptyView = view.findViewById(android.R.id.empty);
   list.setEmptyView(emptyView);
   return view;
}

接下来,在onActivityCreated()中,我初始化并加载ListView的标题,然后加载新闻源项:

@Override
public void onActivityCreated(final Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);

    loadHeader();    
    loadNewsFeed();
}

在loadHeader()方法中,我然后动态创建一个LinearLayout容器来包含我的ViewPager。我为ViewPager创建了一个PagerAdapter,我用InfiniteViewPager包装它,允许在两个方向上无限滑动。然后我创建一个ViewPager,然后将其添加到LinearLayout容器中。然后我将容器作为标题视图添加到ListView:

private void loadHeader() 
{
    final LinearLayout headerContainer = new LinearLayout(getActivity());
    headerContainer.setId(R.id.header_container_id);
    headerContainer.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    headerContainer.setOrientation(LinearLayout.VERTICAL);

    // initialize the pager adapter for the view pager
    PagerAdapter pagerAdapter = new HeaderPagerAdapter(getActivity().getSupportFragmentManager());

    // Create a view pager. I use a custom implementation of a view pager I found from another Stackoverflow answer - WrapContentHeightViewPager - that allows ViewPager's layout.height to wrap content. The original ViewPager does not allow wrapping of content.
    WrapContentHeightViewPager mViewPager = new WrapContentHeightViewPager(getActivity());
    mViewPager.setId(R.id.view_pager_header);
    mViewPager.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));

    // wrap pager to provide infinite paging with wrap-around
    PagerAdapter wrappedAdapter = new InfinitePagerAdapter(pagerAdapter);
    mViewPager.setAdapter(wrappedAdapter);

    // Add the view pager to the header container
    headerContainer.addView(mViewPager);

    // add the container as a header view to the list
      list.addHeaderView(headerContainer);
 }

在loadNewsFeed()方法中,我对新闻源项进行异步提取,并通过将项添加到页脚视图来填充列表。我不会在这个问题的范围之外讨论这方面的实施细节。

NewsFragment包含我的寻呼机适配器,它包含初始化ViewPager要显示的片段的getItem方法:

private class HeaderPagerAdapter extends FragmentPagerAdapter
    {
        public HeaderPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            return DateFragment.newInstance(i);
        }

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

    }

以下是ViewPager中显示的实际片段:

public class DateFragment extends Fragment
{
    private int index;
    TextView date;

    public static final DateFragment newInstance(int index) {
        DateFragment fragment = new DateFragment();

        final Bundle args = new Bundle(1);
        args.putInt(Constants.Extras.PAGE_INDEX, index);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        index = getArguments() != null ? getArguments().getInt(Constants.Extras.PAGE_INDEX) : 1;        
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState)
    {
        View v = (ViewGroup) inflater.inflate(R.layout.summary_fragment, container, false);
        date = (TextView) v.findViewById(R.id.tvDate);
        return v;
    }

    @Override
    public void onActivityCreated(final Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        date.setText("Date: " + index);
    }
}

现在我只是将索引显示为日期。我想用实际日期替换它。为什么片段在滑动时会消失? 注意事项:

  • 是否有被调用的刷新/重绘事件?
  • 是否与扩展FragmentPagerAdapter与FragmentStatePagerAdapter
  • 有关
  • 覆盖destroyItem()或instantiateItem()?
  • 在ViewPager上设置onPageScrolled侦听器,然后处理页面滚动事件?我尝试了thehayro.blogspot.com/2012/12/enable-infinite-paging-with-android.html,这导致我的片段消失,然后在一段时间后出现。
  • 是否因为我将ViewPager作为标题添加到列表视图中?列表视图向上和向下滚动,向左和向右滚动视图寻呼机。我已将此添加到我的ViewPager实现中,以告诉列表视图停止拦截我们的触摸事件:

    @覆盖     public boolean onInterceptTouchEvent(MotionEvent ev)     {         //告诉我们的父母停止拦截我们的活动!         boolean ret = super.onInterceptTouchEvent(ev);         if(ret)         {             。的getParent()requestDisallowInterceptTouchEvent(真);         }         返回;     }

对于这篇文章的篇幅我很抱歉。我觉得这个细节可能是必要的。想法?

0 个答案:

没有答案