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