实现RecyclerView 的通用Adapter

来源:互联网 发布:手机安全中心软件 编辑:程序博客网 时间:2024/06/01 19:56

RecyclerView虽然很好,但是却需要为每一个RecyclerView实现一个Adapter,而没有像BaseAdap那样的通用Adapter,下面就来实现一个通用的Adapter

①首先实现一个BaseViewHolder

public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private SparseArray<View> views;
    private BaseAdapter.OnItemClickListener mOnItemClickListener ;
    public BaseViewHolder(View itemView,BaseAdapter.OnItemClickListener onItemClickListener){
        super(itemView);
        itemView.setOnClickListener(this);
        this.mOnItemClickListener =onItemClickListener;
        this.views new SparseArray<View>();
    }
    public TextView getTextView(int viewId) {
        return retrieveView(viewId);
    }
    public CheckBox getCheckBox(int viewId) {
        return retrieveView(viewId);
    }
    public Button getButton(int viewId) {
        return retrieveView(viewId);
    }
    public ImageView getImageView(int viewId) {
        return retrieveView(viewId);
    }
    public View getView(int viewId) {
        return retrieveView(viewId);
    }

    protected <extends View> retrieveView(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            views.put(viewIdview);
        }
        return (T) view;
    }
    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(v,getLayoutPosition());
        }
    }
}

 

②实现BaseAdapter

public abstract class BaseAdapter<T,extends  BaseViewHolder> extends RecyclerView.Adapter<BaseViewHolder>{
    protected static final String TAG = BaseAdapter.class.getSimpleName();

    protected final Context context;
    protected  int layoutResId;
    protected List<Tdatas;

    private OnItemClickListener mOnItemClickListener null;
    public  interface OnItemClickListener {
        void onItemClick(View view, int position);
    }
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;

    }


    public BaseAdapter(Context context, int layoutResId) {
        this(contextlayoutResId, null);
    }
    public BaseAdapter(Context context, int layoutResIdList<T> datas) {
        this.datas = datas == null new ArrayList<T>() : datas;
        this.context = context;
        this.layoutResId = layoutResId;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup,  int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext())

                                  .inflate(layoutResIdviewGroup, false);
        BaseViewHolder vh = new BaseViewHolder(view,mOnItemClickListener);
        return vh;
    }
    @Override
    public void onBindViewHolder(BaseViewHolder viewHoder,  int position) {
        item = getItem(position);
        convert((H)viewHoderitem);
    }

    @Override
    public int getItemCount() {
        if(datas==null || datas.size()<=0)
            return 0;
        return datas.size();
    }
    public getItem(int position) {
        if (position >= datas.size()) return null;
        return datas.get(position);
    }

    public void clear(){
        if(datas==null || datas.size()<=0)
            return;
        for (Iterator it=datas.iterator();it.hasNext();){
            t = (T) it.next();
            int position = datas.indexOf(t);
            it.remove();
            notifyItemRemoved(position);
        }
    }
    
public  void removeItem(t){
        int position = datas.indexOf(t);
        datas.remove(position);
        notifyItemRemoved(position);
    }
    public List<TgetDatas(){
        return  datas;
    }
    public void addData(List<T> datas){
        addData(0,datas);
    }
    public void addData(int position,List<T> list){
        if(list !=null && list.size()>0) {
            for (t:list) {
                datas.add(positiont);
                notifyItemInserted(position);
            }

        }
    }
    public void refreshData(List<T> list){
        clear();
        if(list !=null && list.size()>0){
            int size = list.size();
            for (int i=0;i<size;i++){
                datas.add(i,list.get(i));
                notifyItemInserted(i);
            }
        }
    }
    public void loadMoreData(List<T> list){
        if(list !=null && list.size()>0){
            int size = list.size();
            int begin = datas.size();
            for (int i=0;i<size;i++){
                datas.add(list.get(i));
                notifyItemInserted(i+begin);
            }
        }
    }

    
protected abstract void convert(viewHoderitem);
}

 

③实现一个SimpleAdapter,类似于ListViewBaseAdapter

public abstract class SimpleAdapter<Textends BaseAdapter<T,BaseViewHolder> {

    public SimpleAdapter(Context context, int layoutResId) {
        super(contextlayoutResId);
    }

    public SimpleAdapter(Context context, int layoutResIdList<T> datas) {
        super(contextlayoutResIddatas);
    }
}

④使用

public class AddressAdapter extends SimpleAdapter<Address> {
    private  AddressLisneter lisneter;
    public AddressAdapter(Context contextList<Address> datas,AddressLisneter lisneter) {
        super(contextR.layout.template_address,datas);
        this.lisneter = lisneter;
    }
    @Override
    protected void convert(BaseViewHolder viewHoder, final Address item) {

        viewHoder.getTextView(R.id.txt_name).setText(item.getConsignee());
        viewHoder.getTextView(R.id.txt_phone).setText(replacePhoneNum(item.getPhone()));
        viewHoder.getTextView(R.id.txt_address).setText(item.getAddr());
        final CheckBox checkBox = viewHoder.getCheckBox(R.id.cb_is_defualt);

        final boolean isDefault = item.getIsDefault();
        checkBox.setChecked(isDefault);
        if(isDefault){
            checkBox.setText("默认地址");
        }
        else{
            checkBox.setClickable(true);
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    if(isChecked && lisneter !=null){

                        item.setIsDefault(true);
                        lisneter.setDefault(item);
                    }
                }
            });
        }
    }
   public interface AddressLisneter{
        public void setDefault(Address address);
    }
}

 

只需实现convert方法即可。

0 0
原创粉丝点击