ViewPager数据保留

时间:2013-01-17 19:22:06

标签: android android-fragments android-viewpager

我不熟悉在Android中使用ViewPagersFragments。我的应用的初始活动有一个ListView,然后转到另一个活动,该活动基本上是基于从初始ListView传递的ID的过滤ListView。我希望用户能够在不同的已过滤ListViews之间滑动。这可能是我普遍缺乏理解,但我有ViewPager功能正常,但当我点击过滤的ListView中的一个项目时,我收到一个错误,因为我有一组值我将存储为我在整个类中引用的成员变量,并且在使用ViewPager时集合始终为空。

这是我到目前为止的代码:

ListingFragment.class:

public class ListingFragment extends SherlockFragmentActivity
{
    private ViewPager mViewPager;  
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter; 
    private static List<Fragment> fragments;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.main);

        mViewPager = (ViewPager)findViewById(R.id.viewpager);  
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());  
        mViewPager.setAdapter(mMyFragmentPagerAdapter);

        DetailsFragment df1 = DetailsFragment.newInstance(1);
        fragments.add(df1);

        DetailsFragment df2 = DetailsFragment.newInstance(2);
        fragments.add(df2);
    }

    private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {  

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }  

        @Override  
        public Fragment getItem(int index) {  

            return fragments.get(index);
        }  

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

DetailsFragment.class

public class DetailsFragment extends SherlockFragmentActivity
{
    private int detailId;
    private static List<Integer> items;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);         
    }

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

    public static DetailsFragment newInstance(int id) {

        DetailsFragment lf = new DetailsFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("id", id);
        lf.setArguments(bundle);
        return lf;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.listing, container, false);

        detailId = getArguments().getInt("id");         

        items = GetItems();

        return view;
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id)
    {
        super.onListItemClick(l, v, position, id);

        final Integer item = items.get(pos); //this is always empty
    }
}

2 个答案:

答案 0 :(得分:0)

您将 int position 传递给onListItemClick()方法,但在get()方法中使用 pos 。尝试替换

final Integer item = items.get(pos);

final Integer item = items.get(position);

答案 1 :(得分:0)

您的代码有问题,但它应该有效:

检查您的姓名,您的ListingFragment SherlockFragmentActivity扩展Activity,如果它是Activity,那么您选择了一个糟糕的名字,而您还有DetailsFragment,它扩展了相同的SherlockFragmentActivity,似乎是Fragment

请勿使用ViewPager适配器的片段列表,这最初会有效,但如果您旋转手机,则会遇到麻烦。您可以使用该列表,但您需要对适配器进行某些修改。

不要items static,因为当您对适配器的两个页面使用相同的类DetaildFragment时,items列表将始终指向GetItems()返回的最后一个结果。

最后,关于items问题,您可以与异常共享堆栈跟踪吗?您是否测试过GetItems以查看它是否返回包含所有数据的有效列表?