自Android 5.0之后,谷歌公司推出了RecylerView控件,那么RecylerView是什么呢?他能做什么呢??
1.为什么叫做RecylerView??
1.不关心item是否显示在正确的位置上,以及如何显示的;LayoutManager来控制显示的风格。
2.不关心item之间是如何划分分割线的;ItemDecoration来控制。
3.不关心Item增加与删除的动画效果;由ItemAnimatior来显示。
4.仅仅关系新如何回收和复用View.
2.RecylerView中重要的类
Adapter:使用RecyclerView之前,需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定.
ViewHolder:
LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。
ItemDecoration:
ItemAnimatior:
3.RecylerView能干什么??
1.可以替代listview、gridView;
2.可以显示横向的ListView;
3.可以显示横向的GridView;
4.可以做成瀑布流的效果;
5.定制Item增加与删除动画;
4.RecylerView的初步用法
在AS的build.gradle中添加recyclerview的依赖:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
**compile files('libs/android-support-v7-recyclerview.jar'**)
}
使用RecylerView必须导入support-v7包.在xml布局文件中创建一个RecylerView的布局:
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
MainActivity中获取这个RecyclerView,并声明LayoutManager与Adapter,代码如下:
private RecyclerView mRecyclerView;
private List<String> mDatas;
private SimpleAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
//创建并设置Adapter
mAdapter = new SimpleAdapter(this, mDatas);
mRecyclerView.setAdapter(mAdapter);
// 设置RecyclerView的布局管理LinearLayoutManager
LinearLayoutManager layoutManager = new LinearLayoutManager(this,
LinearLayoutManager.VERTICAL,false);
mRecyclerView.setLayoutManager(layoutManager);
}
private void initData() {
mDatas = new ArrayList<>();
for (int i = 'A'; i < 'z'; i++) {
mDatas.add("" + (char) i);
}
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
}
接下来就是adapter的创建:
public class SimpleAdapter extends RecyclerView.Adapter<MyViewHolder> {
private Context mContext;
private List<String> mDatas;
private LayoutInflater mInflater;
public SimpleAdapter(Context context, List<String> datas) {
this.mContext = context;
this.mDatas = datas;
mInflater = LayoutInflater.from(context);
}
/** 创建viewHolder */
@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = mInflater.inflate(R.layout.item_simle_textview, viewGroup, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
/** 将数据和界面进行绑定 */
@Override
public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
// 对每一个viewholder进行赋值
myViewHolder.mTextView.setText(mDatas.get(i));
}
// 获取数据的数量
@Override
public int getItemCount() {
return mDatas.size();
}
}
// 自定义一个viewholder。RecyclerView的好处就在于现在相当于强制用户必须使用viewholder进行复用和回收。
class MyViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.text);
}
}
5.注意:在此处可能会报一个”关于RecyclerView使用报错Didn’t find class “android.support.v7.recyclerview.R$styleabl ”的错误:
起因:
其实一直使用RecyclerView都好好的。是直接把RecyclerView放到V7工程的libs下,然后用自己的工程引用V7工程。但是由于要使用新版本的RecyclerView所以更新了一下V7包,就出现了上述的问题了。
分析:
其实报错很明显– 找不到资源文件(因为RecyclerView在22.0.x版本之后才加入资源文件,所以如果引用之前的版本比如21.0.0,是可以直接将jar包放到工程libs目录下的)。于是便打开RecyclerView目录(.\extras\android\support\v7\recyclerview)查看发现里面确实有资源文件。但是百度之后发现jar包中是不带有任何资源文件的。所以应该想办法让工程可以引用到这些资源文件。
解决方法:
进入sdk\extras\android\m2repository\com\android\support\recyclerview-v7\21.0.0目录,找到recyclerview-v7-21.0.0.aar这个文件。用解压软件解压此文件里面有classes.jar,把这个jar包放到项目中的libs文件下即可。这个jar包就是RecyclerView要使用的,可以给它改个名字例如android-support-v7-recyclerview.jar , 便于查看。
6.最终运行效果:
7.绘制分割线。要调用RecyclerView的addItemDecoration(ItemDecoration)方法,但是ItemDecoration没有实现类,只能组件通过继承ItemDecoration来实现。github有,直接引用就好了:
https://github.com/gabrielemariotti/RecyclerViewItemAnimators。