3

編集済み:インターフェースを提案しないでください。
内部に RecyclerView を持つアクティビティがあります。Adapter が作成されるときに、otto で Adapter から Activity にイベントをポストしたい。次のコードを使用しました:
ShoppingCardAdapter

public class ShoppingCardAdapter extends  RecyclerView.Adapter<ShoppingCardAdapter.ViewHolder> {

private Activity activity;
private CardBook cardbook;

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public TextView tvBookName;
    public ViewHolder(View v) {
        super(v);
        tvBookName = (TextView) itemView.findViewById(R.id.tv_book_name);
    }

    @Override
    public void onClick(View view) {
                setTotalFactor();
    }

}

public ShoppingCardAdapter(Activity activity, Realm realm) {
    this.activity = activity;
    dataSet = realm.where(CardBook.class).equalTo("userId", userId).findAll();
    setTotalFactor();
}

@Override
public ShoppingCardAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.shopping_card_item, parent, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    CardBook cardBook = dataSet.get(position);
    holder.tvBookName.setText(cardBook.getName());

}

@Override
public int getItemCount() {
    return dataSet.size();
}

private void setTotalFactor() {
    BusProvider.getInstance().post(new ShoppingCardBooksChangeEvent(dataSet.size(), String.valueOf(dataSet.sum("price"))));
}}


in ShoppingCardActivity

    @Subscribe
public void shoppingCardBooksChanged (ShoppingCardBooksChangeEvent shoppingCardBooksChangeEvent) {
    Log.i("OTTO TEST", "come on :)");
}
@Override protected void onResume() {
    super.onResume();
    BusProvider.getInstance().register(this);
    checkBuyValidation();
}

@Override protected void onPause() {
    super.onPause();
    BusProvider.getInstance().unregister(this);
}


ログが表示されないのはなぜですか?

4

4 に答える 4

1

アクティビティクラスを登録して、次のようなイベントを受け取りますBusProvider.getInstance().register(this);

于 2015-01-13T06:21:54.517 に答える
0

アダプターから投稿するには: コンストラクターでバス インスタンスを取得し、投稿します。

Activityをサブスクライブするには: バス インスタンスを取得し、 でアクティビティを登録しonResume()、 で登録解除しonPause()ます。

RecyclerView.ViewHolderから投稿するには: ViewHolderのコンストラクターでバス インスタンスを取得 (またはアダプターのコンストラクターで取得) して投稿します。

于 2015-08-12T17:58:24.890 に答える
0

少し遅い気がしますが、この種の問題に直面している人への私の答えは次のとおりです。

ショッピングカードアクティビティ

抽象クラスに Otto バスを登録しても効果がない基本抽象クラスかもしれません. したがって, 抽象的ではない外部アクティビティに登録および登録解除する必要があります. これはあなたのコードに基づいて私が言えることです.情報をお知らせください

公式ドキュメントからのコメントは次のとおりです。

登録すると、直接のクラス タイプのメソッドのみが検索されます。Guava イベント バスとは異なり、Otto はクラス階層をトラバースせず、アノテーションが付けられた基本クラスまたはインターフェイスからメソッドを追加しません。これは、ライブラリのパフォーマンスを向上させ、コードをシンプルで明確に保つための明示的な設計上の決定です。

于 2015-11-21T07:57:02.080 に答える
0
"I want post an event from Adapter to Activity by otto, when Adapter will be created"

onClick(View view)メソッドでイベントを投稿しています。したがって、そのメソッドがトリガーされたときにのみイベントが投稿されます。アダプタの作成時にイベントを送信する場合は、このメソッドから移動します。

于 2015-01-14T12:52:14.113 に答える