首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android RecyclerView持有一排排的拉苏

Android RecyclerView持有一排排的拉苏
EN

Code Review用户
提问于 2016-09-21 07:33:22
回答 1查看 292关注 0票数 1

我有一个工作的RecyclerView和所有的东西,我就是这样编写它的:

代码语言:javascript
复制
public class RazzleRecyclerViewAdapter extends RecyclerView.Adapter<RazzleRecyclerViewAdapter.RecyclerViewHolder> {
    private List<Razzle> mRazzleList;
    private Context mContext;
    private SelectRazzleRowListener mSelectRazzleRowListener;

    public RazzleRecyclerViewAdapter(
            Context context,
            List<Razzle> razzleList,
            SelectRazzleRowListener selectRazzleRowListener) {
        mContext = context;
        mRazzleList = razzleList;
        mSelectRazzleRowListener = selectRazzleRowListener;
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new RecyclerViewHolder(LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_razzle_row, parent, false));
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        holder.bindRow(mRazzleList.get(position), position);
    }

    @Override
    public int getItemCount() {
        return mRazzleList.size();
    }

    public class RecyclerViewHolder extends RecyclerView.ViewHolder {
        public int thisPosition;
        public Razzle mThisRazzle;
        public TextView razzleNameTextView;

        public RecyclerViewHolder(View itemView) {
            super(itemView);
            razzleNameTextView = (TextView) itemView.findViewById(R.id.item_razzle_row_textview_razzle_name);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mSelectRazzleRowListener.launchRazzleDetailsActivity(mThisRazzle, thisPosition);
                }
            });
        }

        public void bindRow(final Razzle razzle, int position) {
            mThisRazzle = razzle;
            thisPosition = position;
            razzleNameTextView.setText(razzle.getRazzleName());
        }

    }
}

我怎么才能更好地编码呢?我能说得更清楚点吗?我遵循的是好的约定吗?我能重组一下吗这样就更容易处理了吗?特别是ViewHolder之类的东西?

EN

回答 1

Code Review用户

发布于 2016-09-21 12:22:43

  1. 删除mContext成员。你哪儿都不用它。
  2. 您的代码告诉我们,在Adapter对象的生命周期中,onClickListener不会改变。请使ViewHolder类静态,使其没有对适配器的隐式引用,并将OnClickListener作为构造函数参数传递给ViewHolder。
  3. ViewHolder类及其bindRow方法可以是私有的。

点2解释:

您正在通过构造函数将SelectRazzleRowListener传递给Adapter类,并且不提供一个setter方法来在Adapter对象的生存期内更改该字段-因此,一旦适配器与该侦听器一起创建,他将始终使用它。这没什么。但在这种情况下,您可以对ViewHolder类做一些调整。现在它是非静态的内部类。默认情况下,如果内部类不是静态的,它包含对父类对象的隐式引用(在本例中为Adapter)。从内存泄漏的角度来看,这可能是有风险的,并且注意到这种关系是很好的(测试起来很容易--尝试在当前状态下在适配器类之外创建ViewHolder对象--如果没有静态的话,您将无法这样做)。这也是您可以从ViewHolder类中的适配器访问侦听器对象的原因之一。在我看来,您应该使ViewHolder类是静态的(所以是public static class RecyclerViewHolder ...。然后,您需要通过在SelectRazzleRowListener类和构造函数参数中定义一个字段,将ViewHolder对象传递给ViewHolder。然后,适配器将在ViewHolder期间将选择侦听器传递给onCreateViewHolder

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/141995

复制
相关文章

相似问题

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