3

编辑:请不要建议接口。
我有一个里面有 RecyclerView 的 Activity。我想在创建适配器时通过 otto 将一个事件从适配器发布到活动。我使用了以下代码:
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"))));
}}


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

Register your activity class to receive events like BusProvider.getInstance().register(this);

于 2015-01-13T06:21:54.517 回答
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 回答
0

我觉得有点晚了,但这是我对任何面临这种问题的人的回答,我认为提到的

购物卡活动

可能是一个基本抽象类,在抽象类中注册 Otto 总线无效,因此您必须在非抽象的外部活动中注册和注销,这就是我可以根据您的代码说的,如果还有更多信息请告诉我们

这是来自官方文档的评论:

注册只会在直接类类型上找到方法。与 Guava 事件总线不同,Otto 不会遍历类层次结构并从带注释的基类或接口添加方法。这是一个明确的设计决策,旨在提高库的性能并保持代码简单明了。

于 2015-11-21T07:57:02.080 回答
0

从适配器发布:在构造函数中获取一个总线实例并发布。

要订阅Activity:获取一个总线实例并在其上注册该活动onResume()并在其上注销onPause()

RecyclerView.ViewHolder发布:在ViewHolder的构造函数中获取一个总线实例(或在适配器的构造函数中获取它)并发布。

于 2015-08-12T17:58:24.890 回答