10

我很難搞清楚下一件事情。無法在ViewPager中的另一個片段中刷新/更新列表視圖

我有什麼:我有一個viewpager和幾頁在裏面。在這個問題中,只有兩個是重要的,我們稱它們爲Fragment1和Fragment2,它們彼此相鄰。 Fragment1包含一個由互聯網(外部數據庫)填充數據的列表視圖。 Fragment2包含一個簡單的按鈕。

我的目標:如果我點擊Fragment2中的按鈕,我將新項目添加到外部數據庫。我想用這個新項目更新/刷新Fragment1中的列表視圖。

notifyDataChanged()在我的情況下不起作用,但是到目前爲止,我確信它會重新實現每一頁。我將以最清晰的方式介紹我的問題,讓我們看看我的代碼,這是我的ViewPager適配器:

class MyPagerAdapter extends FragmentStatePagerAdapter { 
     public List<String> fragmentsA; 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
      fragmentsA = fragments; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return Fragment.instantiate(context, fragmentsA.get(position)); 

     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mEntries.get(position % CONTENT.length).toUpperCase(); 
     } 

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

     @Override 
     public int getItemPosition(Object object) { 
      return POSITION_NONE; 
     } 
    } 

片段1 onCreateView()(不久):

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

    getData(); 
    View view = inflater.inflate(R.layout.latestapps_tab, container, false); 
    lw = (ListView) view.findViewById(R.id.lw); 
    context = getActivity().getApplicationContext(); 
    act = this.getActivity(); 
    m_adapter = new ItemAdapter(); 
    lw.setAdapter(m_adapter); 

return view; 
} 

我創建ViewPager和適配器,我設置了ViewPager適配器後來我填的是我與我的viewpager片段在我的主類。在此之後,我開始使用具有2個片段的全功能ViewPager。

pager = (ViewPager)findViewById(R.id.viewpager); 
    adapter = new MyPagerAdapter(getSupportFragmentManager()); 
    indicator = (TabPageIndicator)findViewById(R.id.indicator); 
    pager.setAdapter(adapter); 
    indicator.setViewPager(pager); 
    pager.setCurrentItem(INITIAL_PAGE); 
    pager.setOffscreenPageLimit(3); 

    //adding fragments to the pager 
    fragments.add(Fragment1.class.getName());  
    fragments.add(Fragment2.class.getName()); 

在Fragment1中,我在每個列表項中都有一些文字瀏覽的列表視圖。加載完美:我創建了ArrayLists,我用來自外部數據庫的數據填充了列表。加載完成後,我用這些噸數據填充列表視圖。 在Fragment 2中,我點擊按鈕,我希望listview被更新,以便在列表視圖中創建一個新行,並使用來自外部數據庫的一些數據。 (當然寫入數據庫的作品)

我的猜測是,我可能不會刷新ArrayLists,或者我不重新實例化Fragment1,所以getDataFromSQL()方法永遠不會轉動,只有當我退出並重新啓動應用程序或我刷卡在ViewPager中這麼多,Fragment1被分離。所以我無法更新或刷新Fragment1。有人可以幫助解決這個問題嗎?

編輯

我設法使其與傳遞消息到fragment2自我更新發生。但我不確定它是否是一個好的解決方案,並且沒有更好的方法,即只是刷新整個片段。

SOLUTION

好吧,我想這一定是我的懶惰,但現在我解決它。大家誰還想從另一個刷新片段或只是讓片段之間的連接如,我告訴你相應的處理方法:

  1. 你必須實現自己的監聽器,可以幫助你通過支架上的片段之間的溝通活動。這可以在這裏找到:http://developer.android.com/training/basics/fragments/communicating.html。非常簡單而有用。

  2. 您必須檢索片段,這又是簡單的:Retrieve a Fragment from a ViewPager這些Q提供了幾種可接受的方式,我使用了SpareArray解決方案。

謝謝你的幫助!

+0

任何人都可以給我一個建議嗎? – 2013-04-26 14:30:13

+0

你可以發佈你的onCreateView()爲Fragment1嗎? – Ethan 2013-04-26 21:35:24

+0

我發佈了它。如果您需要我發佈更多內容,請告訴我! – 2013-04-26 21:49:48

回答

3

你需要能夠從你的活動讓您的片段,要做到這一點,你需要從適配器獲得片段,你需要一對夫婦的方法添加到您的網頁適配器

public Fragment getFragment(ViewPager container, int position, FragmentManager fm) { 
    String name = makeFragmentName(container.getId(), position); 
    return fm.findFragmentByTag(name); 
} 

private String makeFragmentName(int viewId, int index) { 
    return "android:switcher:" + viewId + ":" + index; 
} 

然後從您的活動做出以下方法

public Fragment getFragmentbyPosition(int position) { 
    return adapter.getFragment(pager, position, getSupportFragmentManager()); 
} 
現在

上fragment2調用如下

Fragment1 fragment1 = (Fragment1) ((MyActivity)getActivity()).getFragmentbyPosition(0); 

現在您將能夠從片段2調用片段1上的公共方法,因此只需在onClick中使用該方法,然後告訴片段1更新它的列表視圖。

現在makeFragmentName工作的原因就是FragmentPagerAdapter如何爲它所創建的片段創建標記。

+0

2'Fragments'之間的通信不應該留給自己的'Fragments'。谷歌建議'Activity'進行通信:http://developer.android.com/training/basics/fragments/communicating.html – Darwind 2013-04-26 22:11:08

+0

這是不推薦的,我只是展示了一個簡單的用戶可能如何獲得的實現來自視圖尋呼機的片段。 – Eluvatar 2013-04-26 22:16:40

+0

這不建議像Darwind說的那樣。我可以進行回調並將消息傳遞給fragment2以自行更新。但我不確定是否沒有更好的解決方案來刷新它。 – 2013-04-26 22:23:30