2013-05-05 115 views
3

我想在我的活动中AsyncTask完成时更新列表片段,但我不确定是否做错了什么。目前,我有一个按钮,启动AsyncTaskAndroid刷新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> 

回答

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(); 
} 

只要您的任务完成,您的列表就会刷新。

+0

嗨yahya,谢谢你的回应。我加你在这里所描述的方法,也不得不加上 “m_adapter.clear(); \t \t m_adapter.notifyDataSetChanged(); \t \t m_adapter.addAll(this.search_results);”由于适配器仍旧保持对旧的“ArrayList”的引用,因此刷新数据可以工作。 – user2352691 2013-05-06 22:25:36

+0

啊,是的,它当然取决于你如何处理listView及其适配器。我很高兴你做到了:) – yahya 2013-05-07 05:53:58