2014-08-29 19 views
0

我有一個FragmentActivity,它顯示一個android.support.v4.app.FragmentTabHost。這些標籤將是ListFragment類型。 ListFragment片段將有一個ArrayAdapter,它們使用AyncTask從Web服務獲取數據。當我必須更新ArrayAdapter中的數據時,會出現此問題。我似乎無法獲得對選項卡的ListFragment的引用,以便獲取對適配器的引用並更新數據。我想在AysncTaskonPostExecute方法中更新ListFragment。提前致謝。從FragmentTabHost中檢索ListFragment

MyFragmentActivity:

public class MyFragmentActivity extends FragmentActivity { 

private FragmentTabHost fTabHost; 

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

    setContentView(R.layout.myLayout); 

    fTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    fTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

    // Add Nearby Places 
    fTabHost.addTab(fTabHost.newTabSpec("nearby").setIndicator("Nearby"),NearbyFragment.class, null); 
    fTabHost.setCurrentTab(0); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    new RetrievePlacesTask().execute(new PlacesAPIClient().getNearbyPlaces()); 
} 

private class RetrievePlacesTask extends AsyncTask<String, Void, PlacesAPIResults> { 

    public RetrievePlacesTask() { 
     super(); 
    } 

    // Other methods .... 

    protected void onPostExecute(PlacesAPIResults results) { 

     FragmentManager fragmentManager = getSupportFragmentManager(); 
     // This returns null, I believe because it FragmentTabHost is a View not a Fragment 
     Fragment tabhost = fragmentManager.findFragmentById(android.R.id.tabhost); 
     FragmentManager childManager = tabhost.getChildFragmentManager(); 
     ListFragment nearbyListFragment = (ListFragment) childManager.findFragmentByTag("nearby"); 

     // Get adapter and update data 

    } 
} 

}

myLayout.xml:

<android.support.v4.app.FragmentTabHost 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/tabhost" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" /> 

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="0" /> 

    <FrameLayout 
     android:id="@+id/realtabcontent" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" /> 

</LinearLayout> 

NearbyFrag換貨(ListFragment)

public class NearbyFragment extends ListFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    PlaceArrayAdapter adapter = new PlaceArrayAdapter(inflater.getContext(),R.layout.place_list_item, new ArrayList<Place>()); 
    setListAdapter(adapter); 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 

}

回答

0

不知道是否有更好的解決方案在那裏。但這似乎適用於我。我創建了一個接口IHelper,其中有一個方法getAdapter,並具有我的MyFragmentActivity實現。在NearbyFragment中,我不得不重寫onAttach方法,該方法採用Activity(在我的情況下爲MyFragmentActivity),並將其存儲爲NearbyFragment類的成員變量。這樣做允許NearbyFragment類將Activity強制轉換爲IHelper接口並呼叫getAdapter

IHelper:

@Override 
public interface IHelper { 
    public PlaceArrayAdapter getAdapter(); 
} 

更改:

public class MyFragmentActivity extends FragmentActivity 

**爲:**

public class MyFragmentActivity extends FragmentActivity implements IHelper 

貫徹getAdapter方法:

public PlaceArrayAdapter getAdapter() { 
    // Your codez 
} 

** NearbyFragment:**

public class NearbyFragment extends ListFragment { 

    IHelper helper; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      helper = (IHelper) activity; 
     } catch(ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement interface."); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     setListAdapter(helper.getAdapter()); 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 
}