一:首先当然要添加依赖项,添加的项是com.android.support:recyclerview-v7:25.1,填加方法就不说了。
二:接下来修改布局,创建此部件。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
三,要使用RecyclerView,必须使用到几个重要的子类
1.ViewHolder:从名字上就能看出来它只做一件事:容纳View视图,它的任务就是这么简单。
首先创建一个内部类,继承自RecyclerView.ViewHolder。
private class MyHolder extends RecyclerView.ViewHolder{
private TextView tv;
public MyHolder(View itemView) {
super(itemView);
tv = (TextView) itemView;
}
}
这里的构造函数中的View就是容器视图,可以理解为每一行的视图。如果是自定义的视图,你可以在这里对所有容器中的视图进行初始化。
2.Adapter :RecyclerView自己不创建ViewHolder。这个任务实际是由adapter来完成的。adapter是个控制器对象,从模型层获取数据,然后提供给RecyclerView显示,起到了沟通的桥梁作用。
所以说,总结起来adapter负责:
创建必要的ViewHolder;
绑定ViewHolder至模型层数据。
要创建adapter,首先要定义RecyclerView.Adapter子类,RecyclerView需要显示视图对象时,就会去找它的adapter。
private class MyAdapter extends RecyclerView.Adapter<MyHolder>{
private List<String> mStrings;
public MyAdapter(List<String> strings) {
mStrings = strings;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflate = LayoutInflater.from(MainActivity.this);
View view = layoutInflate.inflate(android.R.layout.simple_list_item_1,parent,false);
MyHolder holder = new MyHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyHolder holder, int position) {
holder.tv.setText(mStrings.get(position));
}
@Override
public int getItemCount() {
return mStrings.size();
}
}
1)onCreateViewHolder()
RecyclerView需要新的View视图来显示列表项时,会调用onCreateViewHolder方法。在
这个方法内部,我们创建View视图,然后封装到ViewHolder中。此时,RecyclerView并不要求
封装视图装载数据。
为得到View视图,我们实例化了Android标准库中名为simple_list_item_1的布局。该布局定义
了美观的TextView视图,主要用于列表项的展示。
2)onBindViewHolder(MyHolder holder, int position)
接下来要说的是onBindViewHolder方法。该方法会把ViewHolder的View视图和模型层数据绑定起来。收到ViewHolder和列表项在数据集中的索引位置后,我们通过索引位置找到要显示的数据进行绑定。绑定完毕,刷新显示View视图。
所谓索引位置,实际上就是数组中Crime的位置。取出目标数据后,通过发送crime标题给
ViewHolder的TextView视图,我们就完成了Crime数据和View视图的绑定。
3)getItemCount()
只需要返回列表项的数目。
四:创建RecyclerView并且设置Adapter
mAdapter = new MyAdapter(mStrings);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
注意,没有LayoutManager的支持,不仅RecyclerView无法工作,还会导致应用崩溃。所
以,RecyclerView视图创建完成后,就立即转交给了LayoutManager对象。RecyclerView类的任务就是回收再利用以及定位屏幕上的TextView视图。实际上,定位的任务被委托给了LayoutManager。除了在屏幕上定位列表项,LayoutManager还负责定义屏幕滚动行为。因此,没有LayoutManager,RecyclerView也就没法正常工作了。LinearLayoutManager(this)说明是一个线性布局。
贴出完整代码
package com.example.chenjiongs.mytest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String > mStrings;
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initString();
initViews();
mAdapter = new MyAdapter(mStrings);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
private class MyHolder extends RecyclerView.ViewHolder{
private TextView tv;
public MyHolder(View itemView) {
super(itemView);
tv = (TextView) itemView;
}
}
private class MyAdapter extends RecyclerView.Adapter<MyHolder>{
private List<String> mStrings;
public MyAdapter(List<String> strings) {
mStrings = strings;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflate = LayoutInflater.from(MainActivity.this);
View view = layoutInflate.inflate(android.R.layout.simple_list_item_1,parent,false);
MyHolder holder = new MyHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyHolder holder, int position) {
holder.tv.setText(mStrings.get(position));
}
@Override
public int getItemCount() {
return mStrings.size();
}
}
private void initViews() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
}
private void initString() {
mStrings = new ArrayList<>();
for(int i=0;i<100;i++){
mStrings.add(""+i);
}
}
}
效果图