使用LayoutManager来确定每一个item的排列方式。
为增加和删除项目提供默认的动画效果。
你也可以定义你自己的LayoutManager和添加删除动画,RecyclerView项目结构如下:
Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。
LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。
目前SDK中提供了三种自带的LayoutManager:
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
RecyclerView 最重要的是实现Adapter,adapter中必须实现的三个方法:
①onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
②onBindViewHolder()
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
③getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。
———————————————————————————————
简单的RecyclerView使用方法
1、添加依赖
compile 'com.android.support:recyclerview-v7:24.2.1'
2、使用RecyclerView
3、创建适配器Adapter
private class MyAdapter extends RecyclerView.Adapter{
private final List list;
public MyAdapter(){
list = new ArrayList();
for (int i = 0; i < 30; i++) {
list.add("商品记录" + i)}
}
//OnCreateViewHolder用来给rv创建缓存的
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//参数3:判断条件 true 1.是打气 2.添加到parent
View view = LayoutInflater.from(getContext()).inflate(R.layout.main_recyclerview_item,parent,false);
MyHolder holder = new MyHolder(view);
return holder;
}
//给缓存控件设置数据
public void onBindViewHolder(MyHolder holder, int position) {
String item = list.get(position);
holder.textView.setText(item);
holder.icon.setImageResource(R.drawable.ic_default);
}
//获取记录数
public int getItemCount() {
return list.size();
}
4、创建HolderView
public class MyHolder extends RecyclerView.ViewHolder {
public ImageView icon;
public TextView textView;
//实现的方法
public MyHolder(View itemView) {
super(itemView);
icon= (ImageView) itemView.findViewById(R.id.item_iv_icon);
textView= (TextView) itemView.findViewById(R.id.item_tv_title);
}
}
5、设置adpater和LayoutManager给Recycleview
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
initData();
MyHomeAdapter adapter = new MyHomeAdapter(list);
recyclerView.setAdapter(adapter);
private List list = new ArrayList ();
// 初始化数据
public void initData(){
for (int i = 0; i < 30 ; i++) {
list.add("数据"+i);
}
}
- 封装RecyclerView通用适配器
好处:1.数量动态 2.类型不限 Map
作用:封装了Adapter编写的冗余代码,提供简洁的基类
①封装了BaseHolder
//抽取BaseHolder继承RecyclerView.ViewHolder
public class BaseHolder extends RecyclerView.ViewHolder {
//不写死控件变量,而采用Map方式
private HashMap mViews = new HashMap<>();
public BaseHolder(View itemView) {
super(itemView);
}
/**
*获取控件的方法
*/
public T getView(Integer viewId){
//根据保存变量的类型 强转为该类型
View view = mViews.get(viewId);
if(view==null){
view= itemView.findViewById(viewId);
//缓存
mViews.put(viewId,view);
}
return (T)view;
}
/**
*传入文本控件id和设置的文本值,设置文本
*/
public BaseHolder setText(Integer viewId, String value){
TextView textView = getView(viewId);
if (textView != null) {
textView.setText(value);
}
return this;
}
/**
* 传入图片控件id和资源id,设置图片
*/
public BaseHolder setImageResource(Integer viewId, Integer resId) {
ImageView imageView = getView(viewId);
if (imageView != null) {
imageView.setImageResource(resId);
}
return this;
}
//...还可以扩展出各种控件。
//Fluent API 链式api obj.setxxx().setyyy()....
}
②Holder封装好之后,再封装BaseAdapter
封装的时候,部分参数可以选择由外部的构造函数或者set方法
public class BaseAdapter extends RecyclerView.Adapter {
private List mList = new ArrayList<>();
private int layoutId;
public BaseAdapter(int layoutId,List list){
this.layoutId=layoutId;
this. mList=list;
}
//onCreateViewHolder用来给rv创建缓存
@Override
public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//参数3 判断条件 true 1.打气 2.添加到paraent
// false 1.打气 (参考parent的宽度)
View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
BaseHolder holder = new BaseHolder(view);
return holder;
}
//onBindViewHolder给缓存控件设置数据
@Override
public void onBindViewHolder(BaseHolder holder, int position) {
T item = mList.get(position);
convert(holder,item);
}
protected void convert(BaseHolder holder, T item) {
//什么都没有做
}
//获取记录数据
@Override
public int getItemCount() {
return mList.size();
}
}
③封装之后,继承实现
**
*1.extends 把父类的代码继承过来。 可以少写很多代码。
*2.因为是全部拿来的代码,所以不是所有的代码都适合当前。对于不适合当前的代码(方法)
* 我们可选择@Override 覆盖|重写
*/
public class MyHomeAdapter extends BaseAdapter {
public MyHomeAdapter(List list) {
super(R.layout.main_recyclerview_item, list);
}
@Override
protected void convert(BaseHolder holder, String item) {
holder.setText(R.id.item_tv_title,item).setImageResource(R.id.image,R.drawable.ic_ default);
}
}
④封装之后,代码实现
public class MainActivity extends AppCompatActivity {
private List list = new ArrayList ();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycle_view);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
initData();
MyHomeAdapter adapter = new MyHomeAdapter(list);
recyclerView.setAdapter(adapter);
}
// 初始化数据
public void initData(){
for (int i = 0; i < 30 ; i++) {
list.add("数据"+i);
}
}
}
https://blog.csdn.net/qq_37293612/article/details/54915250