万能的RecyclerView适配器(可添加头)

来源:互联网 发布:太把自己当回事 知乎 编辑:程序博客网 时间:2024/05/23 02:26

相对来说,RecyclerView 的适配器比ListView的适配器复杂许多,下面封装了一个万能的适配器,使用的时候直接以内部类的形式就行了,非常方便。

代码很简单,就不赘述了!


import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.framework.jcodecraeer.base.listener.OnItemClickListener;import com.framework.jcodecraeer.base.listener.OnItemLongClickListener;import java.util.ArrayList;import java.util.List;/** * Created by lzp on 2016/5/27. */public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerHolder> {    public static final int TYPE_HEADER = 0;    public static final int TYPE_NORMAL = 1;    protected List<T> itemList = new ArrayList<>();    private View mHeaderView;    private OnItemClickListener mListener;    private OnItemLongClickListener mLongListener;    public void setOnItemClickListener(OnItemClickListener li) {        mListener = li;    }    public void setOnItemLongClickListener(OnItemLongClickListener li){        mLongListener = li;    }    public BaseRecyclerAdapter(){    }    public BaseRecyclerAdapter(List<T> datas){        itemList.addAll(datas);    }    public void setHeaderView(View headerView) {        mHeaderView = headerView;        notifyItemInserted(1);    }    public View getHeaderView() {        return mHeaderView;    }    public void addItems(T[] datas){        for (T data : datas){            itemList.add(data);        }        notifyDataSetChanged();    }    public void addItems(List<T> datas) {        itemList.addAll(datas);        notifyDataSetChanged();    }    public void removeItem(int position){        itemList.remove(position);        notifyItemRemoved(position);    }    public void setItems(List<T> datas){        itemList.clear();        itemList.addAll(datas);        notifyDataSetChanged();    }    public void clearItems(){        itemList.clear();        notifyDataSetChanged();    }    public T getItem(int position){        return itemList.get(position);    }    /**     * 判断数据是否为空     *     * @return 为空返回true,不为空返回false     */    public boolean isEmpty() {        return itemList.isEmpty();    }    @Override    public int getItemViewType(int position) {        if(mHeaderView == null) return TYPE_NORMAL;        if(position == 0) return TYPE_HEADER;        return TYPE_NORMAL;    }    @Override    public RecyclerHolder onCreateViewHolder(ViewGroup parent, final int viewType) {        if(mHeaderView != null && viewType == TYPE_HEADER) return new HeaderHolder(mHeaderView);        View itemView = LayoutInflater.from(parent.getContext()).inflate(itemViewId(), parent, false);        final RecyclerHolder recyclerHolder = new RecyclerHolder(itemView);        if(mListener != null){            recyclerHolder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    mListener.onItemClick(recyclerHolder);                }            });        }        if(mLongListener != null){            recyclerHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    mLongListener.onItemLongClick(recyclerHolder);                    return true;                }            });        }        return recyclerHolder;    }    @Override    public void onBindViewHolder(final RecyclerHolder viewHolder, int position) {        if(getItemViewType(position) == TYPE_HEADER){            onBindHeader(((HeaderHolder)viewHolder));            return;        }        final int pos = getRealPosition(viewHolder);        final T data = itemList.get(pos);        onBind(viewHolder, pos, data);    }    @Override    public void onAttachedToRecyclerView(RecyclerView recyclerView) {        super.onAttachedToRecyclerView(recyclerView);        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();        if(manager instanceof GridLayoutManager) {            final GridLayoutManager gridManager = ((GridLayoutManager) manager);            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {                @Override                public int getSpanSize(int position) {                    return getItemViewType(position) == TYPE_HEADER                            ? gridManager.getSpanCount() : 1;                }            });        }    }    @Override    public void onViewAttachedToWindow(RecyclerHolder holder) {        super.onViewAttachedToWindow(holder);        ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();        if(lp != null                && lp instanceof StaggeredGridLayoutManager.LayoutParams) {                        StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;            p.setFullSpan(holder.getLayoutPosition() == 0);        }    }    public int getRealPosition(RecyclerHolder holder) {        int position = holder.getLayoutPosition();        return mHeaderView == null ? position : position -1;    }    @Override    public int getItemCount() {        return mHeaderView == null ? itemList.size() : itemList.size()+1;    }    public abstract int itemViewId();    public void onBindHeader(HeaderHolder viewHolder){    }    public abstract void onBind(RecyclerHolder viewHolder, int RealPosition, T data);    public class HeaderHolder extends RecyclerHolder {        public HeaderHolder(View itemView) {            super(itemView);        }    }}


再附上一分ViewHolder


/** * Created by lzp on 2016/5/27. */public class RecyclerHolder extends RecyclerView.ViewHolder {    /**     * 用于存储当前item当中的View     */    private SparseArray<View> mViews;    public RecyclerHolder(View itemView) {        super(itemView);        mViews = new SparseArray<>();    }    public <T extends View> T findView(int ViewId) {        View view = mViews.get(ViewId);        //集合中没有,则从item当中获取,并存入集合当中        if (view == null) {            view = itemView.findViewById(ViewId);            mViews.put(ViewId, view);        }        return (T) view;    }    /**     * 根据id得到TextView     *     * @return     */    public TextView getTextView(int viewId) {        return findView(viewId);    }    /**     * 根据id得到ImageView     *     * @return     */    public ImageView getImageView(int viewId) {        return findView(viewId);    }    /**     * 根据id得到Button     *     * @return     */    public Button getButton(int viewId) {        return findView(viewId);    }    /**     * 根据id得到RadioButton     *     * @return     */    public RadioButton getRadioButton(int viewId) {        return findView(viewId);    }    /**     * 根据id得到CheckBox     *     * @return     */    public CheckBox getCheckBox(int viewId) {        return findView(viewId);    }    /**     * 根据id得到ImageButton     *     * @return     */    public ImageButton getImageButton(int viewId) {        return findView(viewId);    }    /**     * 根据id得到ImageButton     *     * @return     */    public EditText getEditText(int viewId) {        return findView(viewId);    }    /**     * 根据id设置View的隐藏和显示     *     * @param viewId     * @param visibility     */    public void setVisibility(int viewId, int visibility) {        findView(viewId).setVisibility(visibility);    }    /**     * 根据id设置View的点击事件     *     * @param viewId     * @param l     */    public void setOnClickListener(int viewId, View.OnClickListener l) {        findView(viewId).setOnClickListener(l);    }}

0 0
原创粉丝点击