recyclerview의 adapter 코드 최적화

우리는 베이스adapter 코드를 써서 리서치뷰의 공공 부분을 추출한 다음에 인터페이스를 제공한다
코드에 데이터 binding 사용
BaseAdapter.java
package com.yiba.oops.utils;

import android.content.Context;
import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import com.yiba.oops.APP;

import java.util.ArrayList;
import java.util.List;

/** * Created by Administrator on 2016/9/1. * READ ME *  recyclerview adapter viewholder    ,    binding item     ,            */
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseAdapter.BaseViewHolder> {

    protected List<T> mList = new ArrayList<>();
    protected Context mContext;
    private OnRecyclerItemClickListener mOnRecyclerItemClickListener;

    public interface OnRecyclerItemClickListener {
        boolean onRecyclerItemClick(RecyclerView.ViewHolder holder, View view, int position);
    }

    public BaseAdapter(List<T> list) {
        mContext = APP.getContext();
        mList = list;
    }

    @Override
    public BaseAdapter.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewDataBinding binding = getBinding(parent, viewType);
        return new BaseViewHolder(binding);
    }

    /** *   binding   */
    protected abstract ViewDataBinding getBinding(ViewGroup parent, int viewType);

    @Override
    public void onBindViewHolder(BaseAdapter.BaseViewHolder holder, int position) {
        onBindingViewHolder(holder, position);
    }

    /** *   viewholder **/
    protected abstract void onBindingViewHolder(BaseAdapter.BaseViewHolder holder, int position);

    @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }

    public void setOnRecyclerItemClickListener(OnRecyclerItemClickListener onRecyclerItemClickListener) {
        mOnRecyclerItemClickListener = onRecyclerItemClickListener;
    }


    public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private ViewDataBinding binding;

        public BaseViewHolder(View itemView) {
            super(itemView);
            initListener();
        }

        public BaseViewHolder(ViewDataBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
            initListener();
        }

        private void initListener() {
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mOnRecyclerItemClickListener != null) {
                mOnRecyclerItemClickListener.onRecyclerItemClick(this, view, getAdapterPosition());
            }
        }

        public ViewDataBinding getBinding() {
            return binding;
        }
    }
}

사용:
예:
ShareAdapter.java

/** * Created by ${xiaopao} on 2016/9/7. */
public class ShareAdapter extends BaseAdapter<ShareFriends> {
//BaseAdapter<ShareFriends> 
//  BaseAdapter,<ShareFriends> item   

    public ShareAdapter(List<ShareFriends> list) {
        super(list);
    }


    @Override
    protected ViewDataBinding getBinding(ViewGroup parent, int viewType) {
        //    databinding  
        return DataBindingUtil.inflate(
                LayoutInflater.from(mContext),
                R.layout.item_share_friends,
                parent,
                false
        );
    }

//    item       
    @Override
    protected void onBindingViewHolder(BaseAdapter.BaseViewHolder holder, final int position) {
        final ShareItemBinding sharebinding = (ShareItemBinding) holder.getBinding();
        ShareFriends f = mList.get(position);
// LogUtil.HDLog("name:" + f.getName() + " icon: " + f.getIcon());
        String iconurl = f.getIcon();
        String name = f.getName();
        sharebinding.shareName.setText(name);
        Glide.with(mContext)
                .load(iconurl)
                .transform(new GlideCircleTransform(mActivity))
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher)
                .crossFade()
                .into(sharebinding.shareImg);

        if (mList.get(position).isChecked()) {
            sharebinding.shareCheck.setImageResource(R.drawable.selected);
        } else {
            sharebinding.shareCheck.setImageResource(R.drawable.unseleted);
        }
    }

}

클릭 이벤트를 추가하려면://setOnRecyclerItemClickListener를 설정하면 됩니다.
adapter.setOnRecyclerItemClickListener(new BaseAdapter.OnRecyclerItemClickListener() {
            @Override
            public boolean onRecyclerItemClick(RecyclerView.ViewHolder holder, View view, int position) {
                if (sharelist.get(position).isChecked()) {
                    sharelist.get(position).setChecked(false);
                } else {
                    sharelist.get(position).setChecked(true);
                }
                adapter.notifyDataSetChanged();
                return true;
            }
        });

BaseAdapter.java는 프로젝트에 복사해서 직접 사용할 수 있습니다

좋은 웹페이지 즐겨찾기