编辑:请不要建议界面。
我有一个带有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没有出现?
答案 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不会遍历类层次结构,而是从基类或带注释的接口添加方法。这是一个明确的设计决策,可以提高库的性能,同时保持代码的简单和明确。