【问题标题】:Android How can I call notifyDataSetChanged to refresh the list in AsyncTask onPostExecuteAndroid 如何调用 notifyDataSetChanged 来刷新 AsyncTask onPostExecute 中的列表
【发布时间】:2014-01-24 20:40:06
【问题描述】:

我有一个填充了数据库的列表视图,带有一个自定义光标适配器 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 实例?

感谢您的帮助!

【问题讨论】:

  • 你是在 FragmentSavedTripsSection 类的 Lsitview 上设置适配器吗?
  • @amitsingh 我添加了一些代码。谢谢!
  • 在“FragmentSavedTripsSection”类中创建一个“公共”函数,用于通知适配器并从 AsyncTask 的 onPostExecute() 调用该函数。
  • @amitsingh 我补充说: public void notifyDataSetChanged(){ sta.notifyDataSetChanged();我应该如何从 onPostExecute() 调用函数?
  • 通过在 TripUploader 类的构造函数中发送该类的对象来访问它。

标签: android android-asynctask notifydatasetchanged


【解决方案1】:

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

【讨论】:

  • 当用户选择一行时,会触发一次行程上传到数据库。这个操作是在几个地方触发的,所以我必须把它做成一个单独的类。您能否提供有关如何通过适配器的更多详细信息?谢谢!
  • 我添加了代码,成功通过了mSavedTripsAdapter,但是为什么mSavedTripsAdapter.notifyDataSetChanged();没有更新列表?
  • 您确定您的数据已更改吗?我假设您的数据存储在 allTrips 中,那是本机变量还是对象?
  • 它是一个对象。在另一个函数中,它使用 listSavedTrips.invalidate(); populateList(listSavedTrips);更新列表。如果我想这样做,我应该使用什么代码?
  • 我认为数据发生了变化,因为当我杀死应用程序并再次打开时,它是正确的。
【解决方案2】:
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
  }
}

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

【讨论】:

  • 我应该把每个代码放在哪里?我有点困惑;)
  • 编辑了我的答案,你现在应该更清楚了
  • 我添加了代码,但是我不能做 public class FragmentSavedTripsSection extends Fragment implements YourListener{.
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 2013-05-02
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多