2013-01-17 30 views
0

我是在Android中使用ViewPagersFragments的新手。我的应用程序的初始活动有一个ListView然后转到另一个活动,该活动基本上是基于从inital ListView传递的ID过滤ListView。我希望用户能够在不同的过滤ListViews之间滑动。这可能是我的普遍缺乏理解,但我有ViewPager功能工作正常,但是当我点击过滤ListView中的项目时,我收到一个错误,因为我有一个值作为成员变量存储的集合我使用ViewPager时,我在整个课程中都提到了该集合,并且该集合始终是空的。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 
    } 
} 

回答

0

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

检查你的名字,你就ListingFragment延伸SherlockFragmentActivity这似乎是一个Activity(如果这是一个Activity然后你选择了一个可怕的名字),你也有DetailsFragment它扩展了相同的SherlockFragmentActivity这似乎是Fragment

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

不要让itemsstatic,因为,当您使用同一类DetaildFragment的适配器的两个页面,则items列表将总是指向由GetItems()返回的最后结果。

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

+0

我想我已经指出了这个问题。错误的ID正在被传入。看起来,当我滚动时,而不是传入的ID,它应该在应该在的位置之前。所以,在我的例子中,当我滚动到应该通过id 1的片段时,是否传入了2。上面的'ListingFragment.class'中的任何内容都表示可能导致什么? –

+0

@KrisB不,我没有看到明显的东西(是你使用的真实代码)。你确定你没有在'ViewPager'中看到错误的片段('ViewPager'应该从0开始(ID为1),并有另一个片段用ID 2刷入)? – Luksprog

+0

是的,我要开始一个新的问题,因为我有额外的代码,但我不想继续添加到这个。 –

0

您通过INT位置到onListItemClick()方法,但在使用get()方法pos。尝试更换

final Integer item = items.get(pos); 

final Integer item = items.get(position); 
+0

哎呀,那是我的错字。不过,这不是pos或'position'变量,它的集合是空的。 –