2

http 要求が正常に行われたときに、結果をフラグメントに投稿するためにEventBusを使用しています。これは、1 つのサブスクライバーと 1 つのパブリッシャーの関係がある場合にうまく機能します。

ただし、私のアプリケーションでは、ViewPagerタブ付きを使用する画面があります。また、ページは非常に似ているため、各タブに対応する異なるパラメーターを持つ同じフラグメントを使用して、データをダウンロードします。

Fragment は次のように見えます。

public class MyFragment extends Fragment{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
        EventBus.getDefault().register(this);
    }

    public void onEvent(ServerResponse response) {
        updateUi(response);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

そして、データが受信されたときに何が起こるかはすでに推測できます。

同じ署名を持つ多くのサブスクライバーが を待っているServerResponseため、応答は対応するタブに移動しませんが、同じ応答が受信され、すべてのフラグメントで表示され、データが混在します。

これを解決する方法はありますか?

4

1 に答える 1

2

ヘイ!ここでも同じ問題ですが、解決策があります。

問題は、多くのFragments(同じオブジェクトからのインスタンス) があり、それらすべてが同じイベントをリッスンしているため、イベントを投稿するとすべてが更新されることです。

イベントを投稿するときは、位置を送信してみてください。インスタンス化するときFragmentは、ページ アダプターの位置を保存する必要があります。イベントがあなたの同じ位置にあるかどうかを確認した後Fragment

例えば:

public static QuestionFragment newInstance(int position) {
    QuestionFragment fragment = new QuestionFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_POSITION, position);
    fragment.setArguments(args);
    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    vMain = inflater.inflate(R.layout.fragment_question, container, false);
    EventBus.getDefault().post(new GetQuestionEvent(mPosition));
    return vMain;
}

public void onEvent(GetQuestionEvent e) {
    if (e.getQuestion().getPosition() == mPosition) {
        TextView tvPostion = (TextView) vMain.findViewById(R.id.tv_position);
        tvPostion.setText("" + e.getQuestion().getPosition());
    }
}
于 2015-02-06T20:07:02.060 に答える