Android RecyclerView的使用
RecyclerView可以实现ListView和GridView的功能,但是有以下特点:
- 可以实现横向滚动,瀑布样式排列;
- 相较于ListView和GridView中需要手动复用convertView和ViewHolder,RecyclerView内部对对象的复用做了封装,只需要用就可以了;
- Adapter有一个notifyItemChanged()方法,可以对局部数据进行修改;
- 没有统一的Item点击、长按等的监听器,需要在itemView加载时单独设置。
用法
新建一个自己的适配器类,继承RecyclerView.Adapter类,该类拥有一个限定泛型,必须继承自Recycler.ViewHolder类。
private static class RVAdapter extends RecyclerView.Adapter<RVAdapter.RVHolder>{
private ArrayList<Item> data ;
public RVAdapter(ArrayList<Item> data) {
this.data = data;
}
@NonNull
@Override
public RVHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.d(TAG, "onCreateViewHolder: 创建了一个对象");
View view = View.inflate(parent.getContext(),R.layout.onenumber_layout,null);
TextView v1 = view.findViewById(R.id.tv);
TextView v2 = view.findViewById(R.id.tv2);
return new RVHolder(view,v1,v2);
}
@Override
public void onBindViewHolder(@NonNull RVHolder holder, int position) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,position+"",Toast.LENGTH_SHORT).show();
}
});
holder.t1.setText(data.get(position).id+"");
holder.t2.setText(data.get(position).val);
}
@Override
public int getItemCount() {
return data.size();
}
private static class RVHolder extends RecyclerView.ViewHolder{
TextView t1,t2;
public RVHolder(@NonNull View itemView,TextView... textViews) {
super(itemView);
t1=textViews[0];
t2=textViews[1];
}
}
}
需要重写三个方法,分别是
- getItemCount()获取item总数;
- onCreateViewHolder() 创建View时调用,创建好View并放入ViewHolder中,返回这个ViewHolder;
- onBindViewHolder() 复用View时调用,将View从ViewHolder中拿出,填充数据即可。
由于RecyclerView不像ListView那样有onItemClickListener(),如果需要为其设置点击事件,则需要在Adapter的onBindViewHolder()方法中,为这个ItemView设置点击事件(onClickListener)。