添加依赖
要使用RecyclerView,由于该控件并不在Andorid SDK中的,而是在support v7包中,因此我们要手动添加该控件。
在build.gradle中添加如下依赖:
//RecyclerView
compile 'com.android.support:recyclerview-v7:27.1.1'
RecyclerView中几个重要的类
1、RecyclerView.Adapter 适配器,为RecyclerView提供数据。
2、RecyclerView.LayoutManager 布局管理器,为RecyclerView实现不同布局效果。
3、RecyclerView.ItemDecoration item装饰类,为RecyclerView的item添加分割线等。
4、RecyclerView.ItemAnimator item动画类,实现item添加或删除时的动画。
这些类都是抽象类,如果利用不同的实现类,我们就能高度定制RecyclerView。
RecycylerView并没有处理点击事件的监听器,所以如果要监听RecycylerView的点击事件,我们需要自己写监听器
简单使用
首先需要写两个简单的布局文件:
这两个布局都非常简单,MainActivity中就一个RecycylerView,item布局中也只有一个TextView。
MainActivity的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_test"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
item布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="#00CED1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#000000"
android:textSize="24sp" />
</LinearLayout>
2、适配器
RecyclerView的适配器,继承自RecyclerView.Adapter,下面再讲它的几个方法。
public class TestAdapter extends RecyclerView.Adapter<TestAdapter.MyViewHolder> {
private List<String> stringList;
public TestAdapter(List<String> stringList) {
this.stringList = stringList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test_recyclerview, parent, false);
MyViewHolder vh = new MyViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.tvTest.setText(stringList.get(position));
}
@Override
public int getItemCount() {
return stringList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tvTest;
public MyViewHolder(View itemView) {
super(itemView);
tvTest = (TextView) itemView.findViewById(R.id.tv_test);
}
}
}
适配器中的几个抽象方法:
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
public abstract void onBindViewHolder(VH holder, int position);
public abstract int getItemCount();
onCreateViewHolder()
该方法会在RecyclerView需要展示一个item的时候回调,重写该方法,使ViewHolder加载item的布局,布局复用,提高性能,就ListView的优化一样,只不过RecyclerView把这个集成到官方方法中了。
onBindViewHolder()
该方法是填充绑定item数据的。
getItemCount()
该方法是返回item的数量。
3、MainActivity中创建并添加数据
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView rvTest = (RecyclerView) findViewById(R.id.rv_test);
// 如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
rvTest.setHasFixedSize(true);
//竖直排列
LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
// GridLayoutManager mGridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
// StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
rvTest.setLayoutManager(mLinearLayoutManager);
TestAdapter mTestAdapter = new TestAdapter(getList());
rvTest.setAdapter(mTestAdapter);
}
private List<String> getList() {
List<String> stringList = new ArrayList<>();
for (int i = 0; i < 100; i++) {
String string = "Item " + i;
stringList.add(string);
}
return stringList;
}
}
经过上面的操作,我们已经可以成功使用RecycylerView显示数据了,如果不出现失误的话,应该会出现下面的结果:
image.png
4、布局管理器
LinearLayoutManager
刚才使用的LinearLayoutManager是线性布局管理器,也就是跟线性布局差不多,可以让item呈垂直或者水平排列。
LinearLayoutManager有两种构造方法:
public LinearLayoutManager(Context context) ;
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
第一个参数是Context不必多说,第二个参数orientation是布局方向,其值有LinearLayoutManager.HORIZONTAL(水平方向)和LinearLayoutManager.VERTICAL(垂直方向),第三个参数reverseLayout是是否逆向布局,如果为true,则为逆向布局,举个例子,如果是水平布局,然后设置第三个参数为true,那么RecycylerView将是从右向左滑动,具体效果大家可以试一下。
GridLayoutManager
GridLayoutManager是表格布局管理器,也就跟表格布局差不多,使用它的效果跟GridView的效果差不多
GridLayoutManager也有两种构造方法:
public GridLayoutManager(Context context, int spanCount);
public GridLayoutManager(Context context, int spanCount, int orientation,boolean reverseLayout);
第一个参数是上下文,第二个参数spanCount是行数或列数,第三个orientation是布局方向,第四个参数reverseLayout是是否逆向布局,跟LinearLayoutManager差不多
注释掉LinearLayoutManager那一行,再打开GridLayoutManager,设置mGridLayoutManager。
// LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
GridLayoutManager mGridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
// StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
TestAdapter mTestAdapter = new TestAdapter(getList());
rvTest.setLayoutManager(mGridLayoutManager);
显示效果
image.png
StaggeredGridLayoutManager
StaggeredGridLayoutManager是瀑布流布局管理器,瀑布流效果相信大家现在经常看到,如果只使用LIstView或者GridView的话,实现起来是很麻烦的,但是使用RecycylerView就会简单很多,只要使用这个瀑布流布局管理器就行了
StaggeredGridLayoutManager只有一种构造方法:
public StaggeredGridLayoutManager(int spanCount, int orientation);
第一个参数spanCount是行数或列数,第二个参数orientation是布局方向。
注释掉LinearLayoutManager那一行,再打开StaggeredGridLayoutManager,设置mStaggeredGridLayoutManager 。
// LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
// GridLayoutManager mGridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
StaggeredGridLayoutManager mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
TestAdapter mTestAdapter = new TestAdapter(getList());
rvTest.setLayoutManager(mStaggeredGridLayoutManager);
单纯使用StaggeredGridLayoutManager效果也跟GridLayoutManager差不多,没有出现瀑布流效果,所以还需要修改每一个item的height(如果是横向布局的话,则修改width),我们需要将Adapter中的OnBindViewHolder()方法修改一下。
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tvTest.setText(stringList.get(position));
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
lp.height = (int) (100 + Math.random() * 300);
holder.itemView.setLayoutParams(lp);
}
添加几行代码,即随机设置item的height。
显示效果:
image.png
网友评论