2012-12-24 100 views
0

此代碼非常簡單。我有一個ViewPager裏面有幾個Fragment。並且「添加新的尋呼機」按鈕將新的尋呼機添加到ViewPager的第一個位置。無法刷新ViewPager內容

這裏是我的代碼

public class TestPagerActivity extends SherlockFragmentActivity { 

    private ArrayList<String> mData = new ArrayList<String>(); 
    private ViewPager mPager; 
    private TestPagerAdapter mAdapter; 

    @Override 
    protected void onCreate(Bundle b) { 
     // TODO Auto-generated method stub 
     super.onCreate(b); 
     setContentView(R.layout.testpager); 

     mData.add("Looking"); 
     mData.add("into"); 
     mData.add("your"); 
     mData.add("dark"); 
     mData.add("blue"); 
     mData.add("eyes"); 
     mPager = (ViewPager) findViewById(R.id.pager); 
     mAdapter = new TestPagerAdapter(getSupportFragmentManager(), mData); 
     mPager.setAdapter(mAdapter); 
    } 

    public void onAddNewPagerClick(View v) { 
     mData.add(0, "When"); 
     mAdapter.notifyDataSetChanged(); 
     mPager.invalidate(); 
    } 

    public static class TestPagerAdapter extends FragmentStatePagerAdapter { 

     private List<String> mData; 

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

     public TestPagerAdapter(FragmentManager fm, List<String> data) { 
      super(fm); 
      mData = data; 
     } 

     public void updateAdapter(List<String> data) { 
      mData = data; 
      notifyDataSetChanged(); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return TestFragment.newInstance(mData.get(position), position + "/" + mData.size()); 
     } 

     @Override 
     public int getCount() { 
      return mData.size(); 
     } 

    } 

    public static class TestFragment extends SherlockFragment { 
     private static final String KEY_CONTENT = "TestFragment:Content"; 
     private static final String KEY_POSITION = "TestFragment:Position"; 

     public static TestFragment newInstance(String content, String position) { 
      TestFragment fragment = new TestFragment(); 

      StringBuilder builder = new StringBuilder(); 
      builder.append("Page ").append(position).append("\n"); 
      for (int i = 0; i < 20; i++) { 
       builder.append(content).append(" "); 
      } 
      builder.deleteCharAt(builder.length() - 1); 
      fragment.mContent = builder.toString(); 

      return fragment; 
     } 

     private String mContent = "???"; 
     private String mPosition = "x/y"; 

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

      if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) { 
       mContent = savedInstanceState.getString(KEY_CONTENT); 
       mPosition = savedInstanceState.getString(KEY_POSITION); 
      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      TextView text = new TextView(getActivity()); 
      text.setGravity(Gravity.CENTER); 
      text.setText(mContent); 
      text.setTextSize(20 * getResources().getDisplayMetrics().density); 
      text.setPadding(20, 20, 20, 20); 

      LinearLayout layout = new LinearLayout(getActivity()); 
      layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
      layout.setGravity(Gravity.CENTER); 
      layout.addView(text); 

      return layout; 
     } 

     @Override 
     public void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 
      outState.putString(KEY_CONTENT, mContent); 
      outState.putString(KEY_POSITION, mPosition); 
     } 
    } 
} 

的問題是:當我加入一個新的傳呼機後刷新ViewPager,其內容無法正確顯示。一開始,我有6頁,但添加新頁面後,仍然顯示6頁,而我期望7頁。

誰能告訴我什麼是錯在這裏?感謝您的任何建議。

回答

2

脫穎而出的第一件事情是,你在你的網頁列表的前面插入新的項目,但你並沒有實現PagerAdapter方法getItemPosition(Object)告訴ViewPager哪裏有網頁數據集更改後移。如該方法的文檔所述,默認實現報告頁面不會改變位置。如果您的適配器未正確實現此方法,則頁面位置發生變化的ViewPager將無法正常運行。

0

避免FragmentPagerAdapter和使用FragmentStatePagerAdapter。

我希望它會爲你工作也。