网络上关于RecyclerView的文章可以说是数不胜数。但都大同小异。看着他们简直脑袋一团乱糊。
我在这里就说下我的个人理解,菜鸟才能和菜鸟有共同语言,不是吗?
你要想使用它需要:
- 在主要布局里声明一个RecyclerView控件。
- 继承自 RecyclerView.Adapter 的布局管理器。
- 约束内容的布局文件。
- 加载它。
第3,4个暂且抛到一边去。你会发现前2个是不是跟我们最开始学的android四大控件之一的activity很相像?
activity是一个布局文件 和 控制这个布局文件的类
RecyclerView是一个布局控件 和 控制(加载)这个控件的类(容器)
这里倒过来说,先从最后一个步骤说起:
加载一个activity通过Intent:
Intent intent = new Intent(this,需要加载的类) //找到需要加载的类
startActivity(intent) //启动
再来看下RecyclerView如何加载它:
recyclerView = (RecyclerView) findViewById(R.id.recyclerView); //找到要加载的控件
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(SearchActivity.this); //创建一个列表布局
recyclerView.setLayoutManager(layoutManager); //设置布局为上面创建的布局
recyclerView.setAdapter(new MyAdapter(null)); //启动(加载自己的布局管理器,一般null为传入的数据)
现在说说第二个,如何创建一个自己的Adapter:
public class MyAdapter extends RecyclerView.Adapter {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
1.1这是继承自 RecyclerView.Adapter必须要写的三个:
- onCreateViewHolder 在这个步骤里一般 是 绑定内容布局文件与点击
- onBindViewHolder 这里就是 把数据与布局绑定
- getItemCount 这是长度,一般返回你传入的数据的长度
上面一再说数据,而这个我们传入的数据从哪儿传入?一个构造方法搞定。
List<String> mList;
public SearchSuggestionsAdapter(List<String> mList) {
this.mList = mList;
}
还有一个将 内容布局内的控件赋值:
static class MyHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyHolder(View itemView) {
super(itemView);
textView = itemView.findViewbyId(R.id.textview);
}
}
并把MyHolder指定为 RecyclerView.Adapter的泛型:
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
那必须要写的三个方法(1.1)需要更改,你可以直接把那三个删掉,再使用AndroidStudio的Alt+Enter自动补全。
以下是最简单的一种
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
List<String> mList;
public MyAdapter(List<String> mList){
this.mList = mList;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.textView_item,parent,false);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(MyHolder holder, int position) {
holder.textView.setText(mList.get(position));
}
@Override
public int getItemCount() {
if (!mList.isEmpty())return mList.size();
return 0;
}
static class MyHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
实在看不懂的话就跟着一个字一个字得敲。但是不要复制粘贴。敲个几百行自然而然的就懂了。