0

我有一个使用自定义光标适配器 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 函数中,我怎样才能访问我在列表视图类中实例化的同一个 savedTripsAdapter 实例?

谢谢你的帮助!

4

2 回答 2

2

的典型用法notifyDataSetChanged()是在处理视图的同一个类中调用它。

例如,在您的 中Fragment's onViewCreated(),您将获得对ListView和适配器的引用,并且当您准备好数据时,通常在onPostExecute()您会调用 notifyDataSetChanged()更新视图。

如果你喜欢将你的适配器传递给另一个对象来进行数据操作,你可以继续做,没什么特别的,因为 java 通过引用传递对象,所以你的适配器对象在两个类中都是同一个对象

编辑:

我的假设是:

  • 你的适配器被称为sta
  • 你的片段被称为FragmentSavedTrips
  • 您修改数据的对象是调用SavedTripsChanger
  • 您的数据字符串数组是从中调用的。

里面SavedTripsChanger有一个私有变量来保存适配器

私人 SavedTripsAdapter mSavedTripsAdapter;

和一个 setter 方法(可选的 getter 方法)

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

当您创建对象SavedTripsChanger时,将 mSavedTripsAdapter 实例传递给它,无论是在构造函数中还是使用 setter 方法。里面FragmentSavedTrips

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

现在您可以使用它了。完成修改数据并准备更新内部视图后,SavedTripsChanger只需调用notifyDataSetChanged()

mSavedTripsAdapter.notifyDataSetChanged();

于 2014-01-24T20:46:55.717 回答
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
  }
}

通过使用接口,您也可以将此类用于其他活动,而无需将其仅耦合到一个类。

于 2014-01-24T20:46:27.020 回答