我有一个填充了数据库的列表视图,带有自定义游标适配器SavedTripsAdapter。
以下是我初始化适配器的方法: 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函数中,我怎样才能访问我在list视图类中实例化的savedTripsAdapter的同一个实例?
感谢您的帮助!
答案 0 :(得分:2)
notifyDataSetChanged()
的典型用法是在处理视图的同一个类中调用它。
例如,在Fragment's
onViewCreated()
中,您会获得对ListView
和适配器的引用,并在您准备好数据后,通常在onPostExecute()
中您可以致电notifyDataSetChanged()
来更新视图。
如果您希望将适配器传递给另一个对象来进行数据操作,那么您可以继续执行此操作,因为java通过引用传递对象,所以没有什么特别之处,因此您的Adapter对象将是两个类中的相同对象< / p>
编辑:
我的假设是:
sta
FragmentSavedTrips
SavedTripsChanger
内部SavedTripsChanger
有一个私有变量来保存适配器
私人SavedTripsAdapter mSavedTripsAdapter;
和一个setter方法(可选的getter方法)
public SavedTripsAdapter setSavedTripsAdapter(SavedTripsAdapter mSavedTripsAdapter) {
this.mSavedTripsAdapter = mSavedTripsAdapter;
}
创建对象SavedTripsChanger
时,可以在构造函数中或使用setter方法将mSavedTripsAdapter实例传递给它。在FragmentSavedTrips
SavedTripsChanger mSavedTripsChanger = new SavedTripsChanger();
mSavedTripsChanger.setSavedTripsAdapter(sta);
现在您已准备好使用它。完成修改数据并准备好更新SavedTripsChanger
内的视图后,只需调用notifyDataSetChanged()
mSavedTripsAdapter.notifyDataSetChanged();
答案 1 :(得分: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
}
}
通过使用接口,您可以将此类用于其他活动,而无需将其仅耦合到一个类。