在 AsyncTask 后刷新 Android Fragment 视图

3

我试图在 AsyncTask 完成后更新列表片段,但我不确定自己是否做错了什么。目前,我有一个按钮来启动 AsyncTask

search = (Button)findViewById(R.id.search);
    search.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String productname = prodname.getText().toString().trim();
                    if (NetworkManager.isOnline(getApplicationContext())){
                        // Go to Other screen
                        AsyncFetcher results = new AsyncFetcher(currActivity);
                        String _url = "http://192.168.1.3:3000/search.json?
                                       utf8=%E2%9C%93&q="+productname;
                        // progressDialog = ProgressDialog.show(
                        //    ClassifiedsActivity.this, "", "Loading...");
                        results.execute(_url);
                    } else {
                        // Throw some warning saying no internet 
                        // connection was found
                    }
                }
            });

一旦我的执行完成,我需要在我的活动中实例化片段。
ResultFragment resultfrag = new ResultFragment();
getSupportFragmentManager().beginTransaction()
                           .replace(R.id.content_frame, resultfrag).commit();

然而,它似乎无法用列表片段替换我的内容。这是我的布局文件:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
1个回答

12

替换片段与刷新它完全不同。是的,它重新加载其中的每个视图和数据。但您必须将其与新数据相关联。因此,我建议您在片段中创建一个刷新方法,并向该方法发送刷新后的数据,然后通知适配器使用dataSetChanged

为实现此目的,您需要访问当前附加的片段并调用其刷新方法。可以使用findFragmentByTag找到它。

编辑:为了更清楚地说明

当您的AsyncTask完成时,您应该执行类似于下面的onPostExecute方法:

ResultFragment resultFrag = (ResultFragment) getSupportFragmentManager()
                                 .findFragmentByTag("FragToRefresh");
if (resultFrag != null) {
    resultFrag.refreshData(refreshedArray);
}

在您的ResultFragment中,您需要一个名为refreshData的方法,类似于以下内容:
public void refreshData(ArrayList<YourObject> data) {
   yourArray = new ArrayList<YourObject>(data);
   yourAdapter.notifyDataSetChanged();
}

当您的任务完成时,您的列表将被刷新。


嗨yahya,感谢您的回复。我添加了您在此处描述的方法,并且还不得不添加“m_adapter.clear(); m_adapter.notifyDataSetChanged(); m_adapter.addAll(this.search_results);”以使刷新数据工作,因为适配器仍然保留对旧“ArrayList”的引用。 - user2352691
啊,是的,这当然取决于你如何处理listView及其适配器。我很高兴你做到了 :) - yahya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接