Как использовать Asynctask в Android-support-v4.jar Фрагмент? - PullRequest
0 голосов
/ 30 марта 2012

У меня есть TabActivity, которая имеет две вкладки. Я загружаю отдельную активность в каждой вкладке (активность A & B ). Упражнение A, загруженное на вкладку 1, имеет некоторые элементы управления и ListView . Я использую AsyncTask для загрузки данных из веб-службы для этого ListView . Мне пришлось загрузить другое действие, когда пользователь щелкнул элемент ListView, но это новое действие C должно быть загружено на той же выбранной вкладке.

Я искал в интернете и обнаружил, что могу использовать ActivityGroup ... но в то же время я обнаружил, что он устарел. Поэтому с использованием совместимости android-support-v4 Frangment было предложено ..

Я скачал этот android-support-v4.jar и посмотрел образец FragmentTabs , я понял, как я могу использовать фрагменты даже в Android 2.1 .... так что я заменил две действия , которые я показывал на вкладках, двумя фрагментами

Но сейчас я не знаю, как справиться со следующими ситуациями:

  1. Элементы управления ListView & Other не отображаются при выполнении следующего кода.

  2. мне нужно вызвать AsyncTask ... потребуется время, чтобы получить и проанализировать данные XML с сервера, и onCreateView фрагмента вызывается раньше ... так как я могу установить ListView во фрагменте после вызова onCreateView ?

  3. После щелчка по элементу ListView мне нужно будет загрузить еще один фрагмент C в той же вкладке ... как мне этого добиться?

Код для моего фрагмента:

public class UpdatesFragment extends Fragment implements IFeedReceiver {
ArrayList<Feed> _feeds;
Integer _currentPage = 1;
ListView _lvUpdates;
UserMessage _userMessage;

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

    getFeeds();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.updates, container, false);
    this._lvUpdates = (ListView)v.findViewById(R.id.listUpdates);

    return v;
}

private void getFeeds() {
    FeedsCollectorAsyncTask task = new FeedsCollectorAsyncTask(
            getActivity(), this._currentPage);
    task.execute();
}

//This method is called from AsyncTask upon receiving & parsing data. So i m trying to populate my ListView here
@Override
public void onFeedReceived(ArrayList<Feed> feeds) {
    FeedsAdapter adapter = new FeedsAdapter(getActivity(),
            R.layout.feed_list_item, this._feeds);

    this._lvUpdates.setAdapter(adapter);

    // Load detail on item click
    this._lvUpdates.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int index,
                long id) {

        }
    });
}

}

Основная вкладка Активность XML выглядит следующим образом.

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">        
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="0"/>
    <FrameLayout
        android:id="@+android:id/realtabcontent"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="-6dp"/>
</LinearLayout>

И наконец ...

public class PlayMakerActivity extends FragmentActivity {
/** Called when the activity is first created. */
TabHost tabHost;
TabManager mTabManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Resources res = getResources(); // Resource object to get Drawables
   // TabHost tabHost = getTabHost();  // The activity TabHost
    tabHost = (TabHost) findViewById(android.R.id.tabhost);
    tabHost.setup();

    mTabManager = new TabManager(this, tabHost, R.id.realtabcontent);

    mTabManager.addTab(tabHost.newTabSpec("Upudates").setIndicator("Updates"),
            UpdatesFragment.class, null);       
}
}

//also included the following AS It IS
public static class TabManager implements TabHost.OnTabChangeListener {
    ....
    ....
    ....
}

Вы можете указать мне на пример. Ваша помощь очень ценится!

1 Ответ

1 голос
/ 31 марта 2012

Я новичок в разработке Android, но я столкнулся с некоторыми из этих проблем с преобразованием во фрагменты, поэтому я постараюсь помочь как можно лучше.

  1. Этот вопрос связан со вторым, я думаю, поэтому я просто проигнорирую его и надеюсь, что ответ на 2 достаточно хорош.

  2. Я столкнулся с подобной ситуацией, когда я преобразовал действие, которое использовало AsyncTask, во фрагмент.Я не уверен, что это хорошая практика, но я просто перенес свою логику, которая изначально была в onCreate (в вашей ситуации, ваш ListView и ваш вызов getFeeds ()) в метод onCreateView.

  3. Что касается обхода фрагмента, я использовал базовую FragmentActivity, которая устанавливает первый Fragment в соответствующий контейнер в макете FragmentActivitiy.Если вы хотите загрузить другой фрагмент, я полагаю, что вы будете ссылаться на FragmentManager вашего FragmentActivity, начать новую транзакцию и добавить новый фрагмент. Сайт разработчика Android объясняет все это полностью.

Если вы хотите запустить новый фрагмент прямо из открытого фрагмента, то вам нужносначала обратитесь к хосту FragmentActivity, используя getActivity ().Например:

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();

Надеюсь, это поможет!

Всем остальным: я также новичок в ответе на вопрос здесь, поэтому дайте мне знать, если я долженвнести изменения в будущие ответы, которые я публикую.

...