思绪乱了两天,终于能安坐把这些知识点做个梳理。
Adapter用了这么久,却对其一点都不了解,实在惭愧。
Adapter是什么?先来张图片
说的专业点就是数据和UI(View)之间的适配器接口。
通俗点就是通过它把listview、gridview、recylerview跟资源文件和数据关联起来。
不学不知道,一学吓一跳,adapter有如此多的子类。以前都是baseAdapter搞定的。似乎以后用的少了,因为我们有recylerview了。
ViewHolder是比contentview更高效的view缓存工具,在页面复杂的情况下,更加提高效率。
contentview又是什么?看这个喽 listview的加载原理
[Android] ListView中getView的原理+如何在ListView中放置多个item
RecylerView的Adapter中并没有给我们封装setOnItemClickListener的方法,那么我们只能要么自己造,要么用别人的。
我们先看一下怎么用别人的,这个代码肯定是在我们的同性交友网站上了:[ ItemClickSupport decorator
第一步:在ids.xml文件里面添加:
第二步:ItemClickSupport.java考到自己文件夹下。
第三部:使用啦。
ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(
new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// do something.
}
});
我们来自己造个轮子吧。
第一步、建一个MyAdapter类继承RecyclerView.Adapter。
public class MyAdapter extends RecyclerView.Adapter{
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
第二步、添加构造函数初始化上下文、数据和item数量初始化
private Context context;
private ArrayList mlist;
public MyAdapter(Context ctx, ArrayList list) {
context=ctx;
mlist = list;
}
@Override
public int getItemCount() {
return mlist.size();
}
}
第三部、增加一个接口,接口增加一个方法和两个参数
public interface onItemClickListener{
void onClick(View itemView,int position);
}
第四步、修改onCreateViewHolder方法,找到view里的子控件。
private TextView tv;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.card_view, parent, false);
tv = (TextView)view.findViewById(R.id.textView1);
return new RecyclerView.ViewHolder(view) {};
}
第四步、修改onBindViewHolder方法,初始化数据,然后设置监听。
private onItemClickListener onItemClickListener;
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
tv.setText("这里是list里的数据");
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onClick(holder.itemView,holder.getAdapterPosition());
}
});
}
第五步、就可以放心的使用啦,记住我们是要给adapter设置监听的。
RecyclerView rv = (RecyclerView)view.findViewById(R.id.recycleview);
MyAdapter adaper = new MyAdapter(mActivity,list);
rv.setAdapter(adaper);
adaper.setOnItemClickListener((itemView, position) -> {
switch (position){
case 0:
break;
}
});