使用RecyclerView 加载大量数据集已经有一端时间了,但是一直没有对RecyclerView 总结过。今天再一次使用到RecyclerView ,就在这里做一次详细的总结。
引入库
使用RecyclerView 首先需要引入类。在build.gradle文件中引入该类。
implementation 'com.android.support:recyclerview-v7:26.1.0'
LayoutManager:布局管理器
RecyclerView和ListView、GridView不同的一点就是需要添加布局管理器。RecyclerView的布局管理器是一个抽象类,系统提供了三个实现类:
- LinearLayoutManager 线性布局管理器,支持横向或纵向选择。
- GridLayoutManager 网格布局管理器 使用该布局可以实现类似GridView的效果
- StaggeredGridLayoutManager 瀑布流 布局管理器 (如果想用 RecyclerView 来实现自定义效果,则应该去继承实现 LayoutManager,并重写相应的方法。)
RecyclerView的基本使用
recyclerview 用法其实也很简单 activity源码如下:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> datas;
private CharRecyclerAdapter recyclerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
initData();
initRecyclerView();
}
private void initRecyclerView() {
// 定义一个线性布局管理器
LinearLayoutManager manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
//设置adapter
recyclerAdapter=new CharRecyclerAdapter(this,datas);
recyclerView.setAdapter(recyclerAdapter);
}
private void initData() {
datas=new ArrayList<>();
for (int i='A';i<='Z';i++){
datas.add((char)i+"");
}
}
private void initUI() {
recyclerView=findViewById(R.id.recyclerView);
}
}
adapter源码如下:
public class CharRecyclerAdapter extends RecyclerView.Adapter<CharRecyclerAdapter.ViewHolder> {
private List<String> datas;
private Context context;
public CharRecyclerAdapter(Context context, List<String> datas) {
this.context=context;
this.datas=datas;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String charStr=datas.get(position);
holder.tv.setText(charStr);
}
@Override
public int getItemCount() {
return datas.size();
}
static class ViewHolder extends RecyclerView.ViewHolder{
private TextView tv;
public ViewHolder(View itemView) {
super(itemView);
tv=itemView.findViewById(R.id.tv);
}
}
}
activity_main布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
item布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#f0f"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="1"
android:gravity="center"
android:id="@+id/tv"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</LinearLayout>
实现类似listview效果图如下: