2014-01-24 81 views
0

我有一個使用自定義遊標適配器SavedTripsAdapter填充數據庫的列表視圖。Android如何調用notifyDataSetChanged刷新AsyncTask中的列表onPostExecute

下面是我如何初始化適配器: allTrips = mDb.fetchAllTrips();

 String[] from = new String[] { "purp", "fancystart", "fancyinfo", "endtime", "start", "distance", "status" }; 
     int[] to = new int[] { R.id.TextViewPurpose, R.id.TextViewStart, 
       R.id.TextViewInfo }; 

     sta = new SavedTripsAdapter(getActivity(), 
       R.layout.saved_trips_list_item, allTrips, from, to, 
       CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

     lv.setAdapter(sta); 

當我點擊列表項,我可以再通過調用該功能之後,它在完成的AsyncTask上傳。

在FragmentSavedTripsSection:

private void retryTripUpload(long tripId) { 
    TripUploader uploader = new TripUploader(getActivity()); 
    uploader.execute(); 
} 

在TripUploader:

@Override 
protected void onPostExecute(Boolean result) { 
    try { 
     if (result) { 
      Toast.makeText(mCtx.getApplicationContext(),"Trip uploaded successfully.", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(mCtx.getApplicationContext(),"Cycle Atlanta couldn't upload the trip, and will retry when your next trip is completed.", Toast.LENGTH_LONG).show(); 
     } 
    } catch (Exception e) { 
     // Just don't toast if the view has gone out of context 
    } 
} 

然而,TripUploader是一個單獨的類。旅行上傳成功後,數據庫被更新,所以我想刷新列表使用savedTripsAdapter.notifyDataSetChanged()

在哪裏以及應該如何把savedTripsAdapter.notifyDataSetChanged()?

如果我把它放在列表視圖類中,它不會被調用onPostExecute。但是,如果我將它放在TripUploader的onPostExecute函數中,我如何才能訪問我在列表視圖類中實例化的savedTripsAdapter的同一個實例?

感謝您的幫助!

+0

您是否在FragmentSavedTripsSection類的Lsitview上設置適配器? –

+0

@amitsingh我添加了一些代碼。謝謝! – Anhong

+0

makle「FragmentSavedTripsSection」類中的「public」函數用於通知適配器並從AsyncTask的onPostExecute()中調用該函數。 –

回答

2

notifyDataSetChanged()的典型用法是在處理視圖的同一個類中調用它。

例如,在你的 onViewCreated(),你到了ListView參考和適配器,當你有你的數據準備好,一般在onPostExecute()你會打電話notifyDataSetChanged()更新視圖。

如果您更喜歡將適配器傳遞給另一個對象來執行數據操作,那麼您可以繼續前進並做到這一點,沒有什麼特別的,因爲java通過引用傳遞對象,所以您的Adapter對象將在兩個類中都是同一個對象

編輯:

我的假設是:

  • 你的適配器被稱爲sta
  • 您的片段稱爲FragmentSavedTrips
  • 修改數據的對象是電話SavedTripsChanger
  • 您的數據字符串數組是從中調用的。

裏面SavedTripsChanger有一個私有變量來保存適配器

私人SavedTripsAdapter mSavedTripsAdapter;

和一個設置器方法(可選getter方法)

public SavedTripsAdapter setSavedTripsAdapter(SavedTripsAdapter mSavedTripsAdapter) { 
    this.mSavedTripsAdapter = mSavedTripsAdapter; 
} 

在創建對象SavedTripsChanger傳的mSavedTripsAdapter實例,無論是在構造或使用setter方法。 Inside FragmentSavedTrips

SavedTripsChanger mSavedTripsChanger = new SavedTripsChanger(); 
mSavedTripsChanger.setSavedTripsAdapter(sta); 

現在你已經可以使用它了。修改完的數據,並準備更新內部SavedTripsChanger視圖後只需調用notifyDataSetChanged()

mSavedTripsAdapter.notifyDataSetChanged();

+0

當用戶選擇一行時,它會觸發一次旅程被上傳到數據庫。這個操作是在幾個地方觸發的,所以我必須把它作爲一個分離的類。您能否提供更多關於如何通過適配器的細節?謝謝! – Anhong

+0

看到我上面的編輯 –

+0

我添加了代碼,並且我成功地通過了mSavedTripsAdapter,但是爲什麼列表未被mSavedTripsAdapter.notifyDataSetChanged()更新? – Anhong

0
public class TripUploader extends AsyncTask<>{ 
    private listener; 

    public interface YourListener{ 
     onCompleted(boolean result); 
    } 

    public TripUploader(YourListener listener){ 
     this.listener = listener; 
    } 

    protected onPostExecute(boolean result){ 
     listener.onCompleted(result); 
    } 
} 

在主類中,實現這個監聽器和執行方法,所以每當您的AsyncTask完成,您會收到它,你可以讓你的類中notifydatasetchange。

public class FragmentSavedTripsSection extends Fragment implements YourListener{ 

    public void onCompleted(boolean result){ 
     // notify data 
    } 
} 

使用的界面,你可以使用這個類的其他活動也沒有它連接到只有一個類。

+0

我應該在哪裏放置每個代碼?我有點困惑;) – Anhong

+0

編輯我的答案,現在應該更清楚了 –

+0

我加了代碼,但是我不能做公共類FragmentSavedTripsSection extends Fragment implements YourListener {。 – Anhong

相關問題