一. 简介
RecyclerView 是android5.0提出的代替ListView的新控件,还可以实现GridView的效果,自带分割线,也可以自定义分割线,增加List显示的美观性,而新增的LayoutManager可用来确定item的排列方式,可以通过LayoutManager来设置list要展示的是垂直还是水平,还添加了默认的增加和删除item动画。
二. 配置
在model下添加:
compile 'com.android.support:recyclerview-v7:21.0.0'
三. RecyclerView的使用和下拉刷新
(1)简单布局
activity_layout.xml布局:
<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.v4.widget.SwipeRefreshLayout android:id="@+id/swipe" 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.v4.widget.SwipeRefreshLayout> </LinearLayout>
注:在布局中SwipeRefreshLayout是下拉加载的控件
list_layout.xml布局:
<?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="40dp" android:orientation="vertical"> <TextView android:id="@+id/tv_recycler" android:layout_width="match_parent" android:layout_height="40dp" /> </LinearLayout>
注:列表布局我只显示了一个TextView,简单明了。需要注意的是父控件的高度跟list的item的高度相关。
(2)RecyclerView适配器
都知道写ListView展示数据都需要适配器,RecyclerView也不例外
RecyclerViewAdapter.java :
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; import java.util.List; public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyHolder> { List<String> list; //数据集合 Context context; public RecyclerViewAdapter(List<String> list, Context context){ this.list = list; this.context = context; } //初始化item布局 @Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.recycler_layout, parent, false); MyHolder holder = new MyHolder(view); return holder; } //想要怎么处理item,等同于BaseAdapter的getView @Override public void onBindViewHolder(MyHolder holder, int position) { holder.textView.setText(list.get(position)); } //展示的数量 @Override public int getItemCount() { return list.size(); } //自动的HolderView优化,初始化item控件 public class MyHolder extends RecyclerView.ViewHolder { TextView textView; public MyHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.tv_recycler); } } }
注:RecyclerView的适配器跟ListView略不同,但可以看出解耦性很高。
(3)MainActivity.java
import android.graphics.Color; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private SwipeRefreshLayout swipe; private List<String> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initView(); } //添加演示数据 private void initData() { list = new ArrayList<>(); for (int i = 1; i < 21; i++) list.add("item " + i); } private void initView() {
recyclerView = (RecyclerView) findViewById(R.id.recyclerView); RecyclerViewAdapter adapter = new RecyclerViewAdapter(list, this); LinearLayoutManager manager = new LinearLayoutManager(this); manager.setOrientation(OrientationHelper.VERTICAL); //设置布局管理器,可设置水平或垂直 // recyclerView.setLayoutManager(new LinearLayoutManager(this)); //设置布局管理器,默认是垂直(VERTICAL) recyclerView.setLayoutManager(manager); //设置布局管理器 recyclerView.setAdapter(adapter); //设置适配器 recyclerView.setItemAnimator(new DefaultItemAnimator()); //设置item默认动画 //下拉刷新 swipe = (SwipeRefreshLayout) findViewById(R.id.swipe); swipe.setColorSchemeColors(Color.RED); //设置下拉刷新的动画颜色 swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { //下拉刷新的处理事件 @Override public void onRefresh() { swipe.setRefreshing(false); //关闭下拉刷新,此处做下拉刷新的结果处理 } });}}注:注释应该很明了了。
四. 效果图