天天看点

RecyclerView与自定义Adapter

查到笔者的博客已经说明各位读者实在是找不到RecyclerView的简单教程了吧,笔者将提供最基本,最明朗的RecyclerView教程,要求读者有一点点编程经验:

  1. 添加依赖,依赖有很多种,请根据自己的软件版本添加,也可以不添加试试看哈
  2. 在布局文件(即.xml文件)中添加RecyclerView的控件,并设置id
  3. 创建RecyclerView的实例化
final RecyclerView recyclerView = (RecyclerView)findViewById(R.id.布局文件中的id);
//这句话可有可无,分情况用,菜鸟可以先加上
recyclerView.setLayoutManager(new LinearLayoutManager(this));
           

为RecyclerView传入信息

recyclerView.setAdapter(一个Adapter);

这里传入的Adapter(适配器)就像是一个信息的压缩包,为了弥补RecyclerView不能自己读取数据的缺陷——接下来就是解释如何自己写一个压缩包

向adapter里传数据
// 一个声明都能装的List,把装进去的东西都映射为String,到时候查询调用操作,直接根据String往外调用即可
final List<Map<String, Object>> listItems = new ArrayList<>();
// 往里塞东西了
for (int i=; i<; i++){
    Map<String, Object> tmp = new LinkedHashMap<>();
    tmp.put("东西A的name", 东西A);
    tmp.put("first_letter", 东西B);
    // 收敛东西集合
    listItems.add(tmp);
}
// 东西有了,在界面上如何摆放
final CommonAdapter adapter = new CommonAdapter<Map<String, Object>>(this, listItems, R.layout.摆放方法(即layout里的.xml文件)) {
    // 获得控件,并为控件传入数据
    @Override
    public void convert(ViewHolder holder, Map<String, Object> s) {
        TextView 控件 = holder.getView(R.id.控件的id);
            // s.get("东西A的name"),通过之前映射的名字获得数据无论类型
            控件.setText(s.get("name").toString());
        }
   };
           
自定义的adapter

1.在MainActivity.java同目录下新建立一个java文件,表示你要写的Adapter

2.写Adapter

时间紧迫,我就直接用中文在代码内部解释了,需要复制的话把中文都删除谢谢——建议先不写点击函数的功能,先把界面搭出来

首先要继承一个原来的Adapter的类,否则需要多写很多东西
public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder>{

    private Context mContext;
    private int mLayoutid;
    private List<T> mDatas;
    private OnItemClickListener monItemClickListener=null;

初始化函数,正是传入数据的函数,届时数据就从List<T>中传入
    public CommonAdapter(Context context, List<T> datas, int layoutid){
        this.mContext = context;
        this.mLayoutid = layoutid;
        this.mDatas = datas;
    }

这里需要一个自定义的ViewHoder,先写,再说
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        ViewHolder viewHolder = ViewHolder.get(mContext, parent, mLayoutid);
        return viewHolder;
    }

为了设置点击的效果
不点击可以不写,保留内部为空即可,声明还是要有的 
有一个陌生的函数,convert——后面会写,
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position){
        convert(holder, mDatas.get(position));
        if(monItemClickListener != null){
            holder.itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    monItemClickListener.onClick(holder.getAdapterPosition());
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener(){
                @Override
                public boolean onLongClick(View v) {
                    monItemClickListener.onLongClick(holder.getAdapterPosition());
                    return true;
                }
            });
        }
    }

    @Override
    public int getItemCount(){
        return mDatas.size();
    }

    public abstract void convert(ViewHolder holder, T position);

点击函数,不点击可以不写
    public interface OnItemClickListener{
        void onClick(int position);
        void onLongClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener){
        monItemClickListener = onItemClickListener;
    }

    public void removeItem(int position){
        if(position >= ){
            mDatas.remove(position);
            notifyItemRemoved(position);
        }
    }
}
           

3.之前说的ViewHolder,最好写上,因为我们在传入数据的时候,需要内部的一个函数get

public class ViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViews;
    private View mConvertView;

    public ViewHolder(Context context, View itemview, ViewGroup parent){
        super(itemview);
        mConvertView = itemview;
        mViews = new SparseArray<View>();
    }

    public static ViewHolder get(Context context, ViewGroup parent, int layoutid){
        View itemview = LayoutInflater.from(context).inflate(layoutid, parent, false);
        ViewHolder holder = new ViewHolder(context, itemview, parent);
        return holder;
    }

    public <T extends View> T getView(int viewid){
        View view = mViews.get(viewid);
        if(view == null){
            view = mConvertView.findViewById(viewid);
            mViews.put(viewid, view);
        }
        return (T)view;
    }
}
           

方法就介绍到这里,源代码可以贴上来,详见GitHub

https://github.com/AllLiving/Android_lab/tree/master/Shopping