我有一个RecyclerView,它包含一个TextView和一个RatingBar。我不太确定在哪里处理setOnRatingBarChangeListener,应该在RecyclerViewAdapter中处理它还是在其他地方处理?
发布于 2016-02-21 12:53:37
总是尝试通过接口抽象这样的东西,这样您以后就可以重用它并轻松地维护代码。
你有多种方法。
首先考虑常见的RecylerView.Adapter类
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private List<Record> mRecords;
private OnRecordEventListener mClickListener;
public RecyclerViewAdapter(List<Record> records,OnRecordEventListener listener) {
this.mRecords = records;
this.mClickListener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_item, viewGroup, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Record record = records.get(i);
viewHolder.textViewTitle.setText(record.getName());
viewHolder.ratingBar.setRating(record.getRating());
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView textViewTitle;
private RatingBar ratingBar;
public ViewHolder(View itemView) {
super(itemView);
textViewTitle = (TextView) itemView.findViewById(R.id.text_view_title);
ratingBar = (RatingBar) itemView.findViewById(R.id.rating_bar_rating);
}
}
}我会像这样使用界面
public interface OnRecordEventListener {
void onRatingBarChange(Record item,float value);
}请注意,我可以做这样的事
public interface OnRecordEventListener implements OnRatingBarChangeListener 但是,没有将item对象(Record)传递回实现该接口的类,只有setTag到RatingBar的方式,但我认为这是一个糟糕的解决方案。
您的Activity、Fragment或任何对象都应该实现这个接口。
创建ViewHolder时,像这样将侦听器传递给构造函数。
public ViewHolder(View itemView, OnRecordEventListener listener) {
super(itemView);
textViewTitle = (TextView) itemView.findViewById(R.id.text_view_title);
ratingBar = (RatingBar) itemView.findViewById(R.id.rating_bar_rating);
bar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
if (fromUser) {
listener.onRatingBarChange(mRecords.get(getLayoutPosition()), rating);
}
}
});
}当然,在onCreateViewHolder里
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_item, viewGroup, false);
return new ViewHolder(v,mClickListener);
}此外,您还可以使用onBindViewHolder中的setter方法来完成这一任务。我认为传递构造函数已经足够了。
另一种方法是在评级栏更改时使用类似EventBus的方式发送事件,但就我个人而言,最好使用侦听器方法,EventBus是强大的设计架构,但很难调试,在这种情况下,我认为它将是多余的。
编辑
此外,您还可以将该接口用于其他事件,如单击按钮或其他,只需将方法添加到接口中,实现它并在ViewHolder构造函数中绑定。
更新
考虑您在Activity中使用的是Activity
public class RecyclerActivity extends Activity implements OnRecordEventListener {
// all institutionalization, callbacks, hook methods
@Override
public void onCreate() {
// Initialization .....
mRecyclerView.setLayoutManager(...);
// Passing this because this class implements interface
mRecyclerView.setAdapter(new RecyclerViewAdapter(mRecord,this));
}
@Override
void onRatingBarChange(Record item,float value) {
// Save your object into database here
}
}这取决于您的底层架构。
ORM,那么您的对象可能是从基ORM对象类继承的,所以它可能有像save、update这样的方法。Activity或ContentProvider直接从Cursor保存数据,则应手动进行序列化并保存到db中。https://stackoverflow.com/questions/35535767
复制相似问题