如何使用otto将事件从适配器发布到活动

时间:2015-01-13 06:11:45

标签: android adapter otto

编辑:请不要建议界面。
我有一个带有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);
}


为什么Log没有出现?

4 个答案:

答案 0 :(得分:1)

注册您的活动类以接收BusProvider.getInstance().register(this);

等活动

答案 1 :(得分:0)

"I want post an event from Adapter to Activity by otto, when Adapter will be created"

您要使用onClick(View view)方法发布活动。所以它只会在触发该方法时发布事件。如果要在创建适配器时发布事件,请将其移出此方法。

答案 2 :(得分:0)

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

订阅活动:获取一个总线实例并在onResume()上注册该活动,并在onPause()上取消注册。

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

答案 3 :(得分:0)

我觉得这有点晚了,但是对于任何面临这类问题的人来说,这是我的答案,我想提到的

  

ShoppingCardActivity

可能是一个基本的抽象类,在抽象类中注册Otto总线没有效果,所以你必须在你的外部活动中注册和取消注册,这不是抽象的,这是我可以根据你的代码说的,如果还有更多信息请告诉我们

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

  

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