Android开发中代码的一些优化
2017-04-17 本文已影响0人
cumtsi
RecyclerView相关:
- Recyclerview 加载图片的时候相信大家一般都会在 adapter 的 onBindViewHolder 中这样使用
Glide.with(context).load(url).into(imageView);
但是这样会有一个小小的问题,就是 Glide 会为每个 Item 创建一个 RequestManger 对象( Glide.with(context) 函数的作用就是创建 RequestManger )。因此我们可以在 Fragment 或者 Activity 中创建好 RequestManger 对象把它作为 RecyclerviewAdapter 的构造函数的参数传递进来,而不是传递 Context 对象。
在 Fragment 或者 Activity 中:
mAdapter = new MemberAdapter(Glide.with(this), mList);
在你的RecyclerviewAdapter中:
private RequestManger mGlide;
public MemberAdapter(RequestManager glide, List<MemberInfo> list) {
mGlide = glide;
mList = list;
}
...
@Override
public void onBindViewHolder(final MemberHolder memberHolder, int position) {
memberHolder.itemView.setTag(position);
MemberInfo member = memberList.get(position);
if(member == null) return;
BmobFile portalFile = member.getMemberPortalFile();
if(portalFile == null){
mGlide.load(member.getMemberPortalFile().getUrl())
.centerCrop()
.crossFade()
.into(memberHolder.portalImg);
}
}
- 为 Recyclerview 的 item 添加 Listener
最容易想到的就是在 onBindViewHolder 函数中为每个 item 设置 OnClickListener,然后在 onClick 中设置自己的回调。但是这种情况会为每个 ViewHolder 创建了 OnClickListener 的实例,如下面的代码所示。
@Override
public void onBindViewHolder(final MemberHolder memberHolder, int position) {
memberHolder.itemView.setTag(position);
MemberInfo member = memberList.get(position);
if(member == null) return;
memberHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnRecyclerViewItemClickListener.onItemClick(v,position);
}
});
}
因此,可以做点优化,让 Adapter 实现 OnClickListener 接口或者 ViewHolder 实现 OnClickListener 接口,所有的 ViewHolder 公用一个 OnClickListener。
Adapter 中实现 OnclickListerner:
public class MemberAdapter extends RecyclerView.Adapter<MemberHolder> implements View.OnClickListener{
...
@Override
public MemberHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView;
...
MemberHolder holder = new MemberHolder(itemView,viewType);
itemView.setOnClickListener(this);//一定要在创建holder之后设置监听
return holder;
}
@Override
public void onBindViewHolder(final MemberHolder memberHolder, final int position) {
memberHolder.itemView.setTag(position);
...
}
@Override
public void onClick(View v) {
if (mOnRecyclerViewItemClickListener != null)
mOnRecyclerViewItemClickListener.onItemClick(v, (Integer) v.getTag());
}
}
ViewHolder 中实现 OnClickListener(MemberHolder 是 MemberAdapter 的内部类):
public class MemberHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public MemberHolder(View itemView,int viewType) {
super(itemView);
...
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (mOnRecyclerViewItemClickListener != null)
mOnRecyclerViewItemClickListener.onItemClick(v, (int) v.getTag());
}
}
还有可以在 Activity 或者 Fragment 中