如何在android-support-v4.jar片段中使用asynctask?

时间:2012-03-30 18:47:45

标签: android android-asynctask android-fragments android-tabhost

我有一个TabActivity,它有两个标签。我在每个标签中加载了单独的活动(活动 A & B )。在标签1中加载的活动A包含某些控件 ListView 。我使用 AsyncTask ListView 的Web服务加载数据。当用户点击ListView项目时,我必须加载另一个活动,但新的活动 C 应该加载到同一个选定的标签中。

我在互联网上搜索,发现我可以使用 ActivityGroup ......但与此同时,我发现它已被弃用。所以建议使用android-support-v4兼容性 Frangment

我下载了 android-support-v4.jar 并查看了 FragmentTabs 示例,我知道如何在Android 2.1中使用Fragments ....所以我替换了两个活动,我在选项卡中显示了两个碎片

但现在我不知道如何处理以下情况:

  1. ListView&当我运行以下代码时,其他控件不显示。

  2. 我必须调用AsyncTask ...它需要时间来获得&解析来自服务器的XML数据,之前调用Fragment的 onCreateView ...那么如何在调用 onCreateView 之后在片段中设置 ListView

  3. 点击ListView项目后,我必须在同一个标签中加载另一个 C 片段...我该如何实现?

  4. 我的片段代码如下:

    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 个答案:

答案 0 :(得分:1)

我是Android开发的新手,但我遇到了一些转换为片段的问题,所以我会尽力帮助。

  1. 这个问题与我认为的第二个问题有关,所以我会忽略它,并希望答案2能够很好地解决它。

  2. 我遇到了类似的情况,我将使用AsyncTask的活动转换为片段。我不确定这是不是很好的做法,但我只是将原来在onCreate中的逻辑(在你的情况下,你的ListView和你的getFeeds()调用)移动到onCreateView方法中。

  3. 就片段遍历而言,我使用了一个基础FragmentActivity,它将第一个Fragment设置为FragmentActivitiy布局中的相应容器。如果您想加载另一个片段,我相信您将引用FragmentActivity的FragmentManager,启动一个新事务并添加一个新片段。 android developer website彻底解释了所有这些。

  4. 如果您想直接从开放片段启动新片段,那么您首先需要使用getActivity()引用主机FragmentActivity。例如:

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

    希望这有帮助!

    对其他人:我也是新来回答这里的问题,所以请告诉我是否应该更改我发布的未来回复。