0

カスタム カーソル アダプターの SavedTripsAdapter を使用して、データベースが取り込まれたリスト ビューがあります。

アダプターを初期化する方法は次のとおりです。

        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;

およびセッター メソッド (オプションのゲッター メソッド)

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

オブジェクトを作成するときSavedTripsChangerは、コンストラクターまたはセッター メソッドを使用して mSavedTripsAdapter インスタンスを渡します。中身FragmentSavedTrips

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

これで使用する準備が整いました。データの変更が完了し、内部のビューを更新する準備ができたらSavedTripsChangernotifyDataSetChanged()

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
  }
}

インターフェイスを使用することで、このクラスを 1 つのクラスだけに結合することなく、他のアクティビティにも使用できます。

于 2014-01-24T20:46:27.020 に答える