2014-08-29 5 views
0

У меня есть FragmentActivity, который отображает android.support.v4.app.FragmentTabHost. Вкладки будут иметь тип ListFragment. Фрагменты ListFragment будут иметь ArrayAdapter, которые используют AyncTask для получения данных из веб-службы. Проблема возникает, когда мне нужно обновить данные в ArrayAdapter. Кажется, я не могу получить ссылку на вкладку ListFragment, чтобы получить ссылку на адаптер и обновить данные. Я хотел бы иметь обновление ListFragment в методе onPostExecuteAysncTask. Заранее спасибо.Retrieve ListFragment от FragmentTabHost

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 

** To: **

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); 
    } 
} 
Смежные вопросы