序言:上一篇述说了android架构层,本篇主要学习RecyclerView刷新与加载,原理就是刷新使用的是SwipeRefireshLayout,而加载更多是采用RecyclerView的滚动监听(addOnScrollListener),
1.第一步当然是先写布局啦
<?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.v4.widget.SwipeRefreshLayout android:id="@+id/srf_mains" android:layout_width="wrap_content" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_ab" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_bright"/> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>
其中SwipeRefireshLayout是谷歌原生的刷新控件,所以现在好多软件都采用这种效果来刷新数据,RecyclerView是
ListView和GridView的更新迭代产品,虽然代码相对复杂点,没有setonImtemOnclickListener,只能在itemview设置或者设置回调,但却相对灵活,也很强大,能实现横向,纵向,瀑布流等效果。
2.业务逻辑
public class Main2Activity extends AppCompatActivity { private List<String> list = new ArrayList<>(); MyViewAdapter myViewAdapter; SwipeRefreshLayout srf_mains; RecyclerView rv_ab; @TargetApi(Build.VERSION_CODES.M) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); //初始化视图 initView(); //业务逻辑 initData(); } private void initView() { srf_mains = (SwipeRefreshLayout) findViewById(R.id.srf_mains); rv_ab = (RecyclerView) findViewById(R.id.rv_ab); } private void initData() { //给集合创建假数据 for (int i=0;i<20;i++){ list.add("第"+i+"条数据"); } //设置recyclerview的样式,这里采用纵向线性样式 rv_ab.setLayoutManager(new LinearLayoutManager(this)); //创建适配器 myViewAdapter = new MyViewAdapter(); //设置设配器 rv_ab.setAdapter(myViewAdapter); //SwipeRefreshLayout设置刷新监听,这里模拟集合数据清空,重新添加 srf_mains.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (list.size()>0){ list.clear(); for (int i=0;i<20;i++){ list.add("第"+i+"条数据"); } } myViewAdapter.notifyDataSetChanged(); srf_mains.setRefreshing(false); ToastUtils.show(Main2Activity.this,"刷新成功"); } }); //recyclerview设置滚动监听,当到达最底部时分页加载数据,刷新适配器 rv_ab.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if(newState == RecyclerView.SCROLL_STATE_IDLE){ list.add(list.size()-1,"底部"); myViewAdapter.notifyDataSetChanged(); } } }); }3.最后粘上adapter的代码
private class MyViewAdapter extends RecyclerView.Adapter<MyViewAdapter.MyViewHolder> { @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType==0){ return new MyViewHolder(LayoutInflater.from(Main2Activity.this).inflate(R.layout.item_view, parent, false)); } return new MyViewHolder(LayoutInflater.from(Main2Activity.this).inflate(R.layout.item_views, parent, false)); } @Override public int getItemViewType(int position) { if (position==list.size()-1){ return 1; } return 0; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { if (position!=list.size()-1){ holder.tv_iteme.setText(list.get(position)); } } @Override public int getItemCount() { return list.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { TextView tv_iteme; public MyViewHolder(View itemView) { super(itemView); tv_iteme = (TextView) itemView.findViewById(R.id.tv_iteme); } } }总结:我采用的是分类型的adapter,一部分是数据显示部分,底部是加载更多显示,通过对recyclerview的滚动监听,当滑动到底部来加载更多,也就是分页显示,刷新部分采用的是官方的控件。