RecyclerView介绍
RecylerView是support-v7包中的新组件,是一个强大的滑动组件。
RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的 逻辑被封装了,写起来更加简单。
提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还有StaggeredGridLayoutManager等),也就是说RecylerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。你想控制Item的分隔线,可以通过继承RecylerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。
可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecylerView有其自己默认的实现。
1、RecyclerView中的Adapter和ViewHolder:
(1)导入V7包
(2)在布局文件中引入RecyclerView,并导入自定义属性
(3)activity_main
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<!-- 导入RecyclerView的自定义属性: xmlns:app="http://schemas.android.com/apk/res-auto" -->
<!-- 先将layoutmanager写死 :-->
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler"
app:layoutManager="LinearLayoutManager"
/>
</RelativeLayout>
(4)主程序中引用
package com.example.recyclerview;
import android.os.Bundle;
import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recycler=(RecyclerView) findViewById(R.id.recycler);
}
}
(5)adpter编写
package com.example.recyclerview;
import java.util.List;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
private Context context;
private List<String>list;
/**
* 3、MyAdapter的构造方法添加构造方法
*/
public MyAdapter(Context context, List<String> list) {
super();
this.context = context;
this.list = list;
}
/**
* 1、编写viewHolder:注意再listView当中我们编写的viewHolder是我们自定义的,但是再RecyclerView
* 中viewholder被规范化了,它需要继承自RecyclerView的viewHolder,写好自己的ViewHolder
*/
public static class MyViewHolder extends RecyclerView.ViewHolder{
private TextView text;
/**
* 2、编写viewHolder的构造方法
*/
public MyViewHolder(View itemView) {
super(itemView);
//2.1找到item中的text
text=(TextView) itemView.findViewById(R.id.item_text);
}
}
/**
* 3、实现它的三个抽象方法
*/
/**
* 返回这个adpter中一共有多少条数据
*/
@Override
public int getItemCount() {
// TODO Auto-generated method stub
return list.size();
}
/**
* 把现在的数据绑定到原有的viewHolder上
*/
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.text.setText(list.get(position));
}
/**
* 相当于在listview中,onCreatView为空时,需要去创建viewHolder
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=LayoutInflater.from(context).inflate(R.layout.item, parent,false);
return new MyViewHolder(view);
}
}
注意:
ListView与RecyclerView在布局文件编写的时候,在宽高的指定上市不同的!在listView中在height高度的指定中无论写match_parent和wrap_content展示出来的效果是一样的,但是在RecyclerView当中,讲height的高度设为match_parent,它真的会沾满整个屏幕。