查到笔者的博客已经说明各位读者实在是找不到RecyclerView的简单教程了吧,笔者将提供最基本,最明朗的RecyclerView教程,要求读者有一点点编程经验:
- 添加依赖,依赖有很多种,请根据自己的软件版本添加,也可以不添加试试看哈
- 在布局文件(即.xml文件)中添加RecyclerView的控件,并设置id
- 创建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