Android开发中代码的一些优化

2017-04-17  本文已影响0人  cumtsi

RecyclerView相关:

  1. 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);
       }
  } 
  1. 为 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 中

上一篇下一篇

猜你喜欢

热点阅读