首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RatingBar in a RecyclerView

RatingBar in a RecyclerView
EN

Stack Overflow用户
提问于 2016-02-21 11:55:25
回答 1查看 4.1K关注 0票数 1

我有一个RecyclerView,它包含一个TextView和一个RatingBar。我不太确定在哪里处理setOnRatingBarChangeListener,应该在RecyclerViewAdapter中处理它还是在其他地方处理?

EN

Stack Overflow用户

回答已采纳

发布于 2016-02-21 12:53:37

总是尝试通过接口抽象这样的东西,这样您以后就可以重用它并轻松地维护代码。

你有多种方法。

首先考虑常见的RecylerView.Adapter

代码语言:javascript
运行
复制
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);
            }
        }
    }

我会像这样使用界面

代码语言:javascript
运行
复制
public interface OnRecordEventListener  {
      void onRatingBarChange(Record item,float value);
}

请注意,我可以做这样的事

代码语言:javascript
运行
复制
public interface OnRecordEventListener implements OnRatingBarChangeListener 

但是,没有将item对象(Record)传递回实现该接口的类,只有setTagRatingBar的方式,但我认为这是一个糟糕的解决方案。

您的ActivityFragment或任何对象都应该实现这个接口。

创建ViewHolder时,像这样将侦听器传递给构造函数。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
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 
    }
}

这取决于您的底层架构。

  1. 如果您使用的是ORM,那么您的对象可能是从基ORM对象类继承的,所以它可能有像saveupdate这样的方法。
  2. 如果要使用ActivityContentProvider直接从Cursor保存数据,则应手动进行序列化并保存到db中。
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35535767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档