【问题标题】:Android Refreshing Fragment View after AsyncTaskAsyncTask后Android刷新片段视图
【发布时间】:2013-05-05 20:02:29
【问题描述】:

当我的活动中的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>

【问题讨论】:

    标签: android android-asynctask fragment


    【解决方案1】:

    首先替换片段与刷新片段完全不同。是的,它还会重新加载其中的每个视图和数据。但是你必须将它与你的新数据联系起来。所以我建议你在你的片段中创建一个刷新方法并将这个方法发送给你刷新的数据,然后将你的适配器通知为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”的引用。
    • 啊,是的,这当然取决于您如何处理 listView 及其适配器。我很高兴你做到了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多