android中RecyclerView的简单使用(四)——上下拉刷新的实现
2017-05-25 20:02
561 查看
上一篇讲述了recyclerview实现瀑布流,而在本篇中将讲述recycler view实现上下拉刷新。(附加嵌套checkbox错乱问题的解决)
代码中添加了较为详细的注释,就不多说了,直接贴代码。
代码如下:
首先,先贴出Adapter中的代码。
然后就是MainActivity中的代码:
以上四篇文章就是我对recycler v iew的了解,如有不足或者欠缺的地方,还望多多指教。
代码中添加了较为详细的注释,就不多说了,直接贴代码。
代码如下:
首先,先贴出Adapter中的代码。
package com.example.cn.bgs.swiprecycleviewdemo; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ProgressBar; import android.widget.TextView; public class MyAdapter extends RecyclerView.Adapter<ViewHolder> { private Context context; private List<String> list; // 加载的状态 private int loadState = LOADING; // 两种view的类型 private static final int ITEM_VIEW = 1; private static final int FOOTER_VIEW = 2; // 底部视图的两种方式-加载更多 和 没有更多数据了 private static final int LOADING = 3; private static final int NO_MORE = 4; private boolean isChecked; private Map<Integer,Boolean> map=new HashMap<Integer,Boolean>(); public MyAdapter(Context context, List<String> list) { this.context = context; this.list = list; } /* * 获得相应位置视图的类型 */ @Override public int getItemViewType(int position) { // TODO Auto-generated method stub if (position + 1 == getItemCount()) { //底部视图 return FOOTER_VIEW; } else { //条目试图 return ITEM_VIEW; } } /* * 设置适配器加载的状态(加载更多和没有更多) */ public void setloadState(int state) { this.loadState = state; notifyDataSetChanged(); } @Override public int getItemCount() { // TODO Auto-generated method stub return list.size() + 1; } @Override public void onBindViewHolder(ViewHolder holder, final int pos) { // TODO Auto-generated method stub if (holder instanceof ItemHolder) { ((ItemHolder) holder).mtv.setText(list.get(pos)); final Integer tag=new Integer(pos); ((ItemHolder) holder).mcb.setTag(tag); if(map.containsKey(tag)){ ((ItemHolder) holder).mcb.setChecked(map.get(tag)); }else{ ((ItemHolder) holder).mcb.setChecked(false); } ((ItemHolder) holder).mcb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub if(!isChecked){ map.put(tag, true); }else{ map.put(tag, false); } } }); } if (holder instanceof FooterHolder) { //判断底部视图加载状态 switch (loadState) { case LOADING: ((FooterHolder) holder).mpb.setVisibility(View.VISIBLE); ((FooterHolder) holder).mtv.setText("正在加载更多数据..."); break; case NO_MORE: ((FooterHolder) holder).mpb.setVisibility(View.GONE); ((FooterHolder) holder).mtv.setText("没有更多数据了..."); break; } } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // TODO Auto-generated method stub //根据viewHolder判断布局的加载 switch (viewType) { case ITEM_VIEW: View v = LayoutInflater.from(context).inflate(R.layout.item, parent, false); ItemHolder holder = new ItemHolder(v); return holder; case FOOTER_VIEW: View fv = LayoutInflater.from(context).inflate(R.layout.footer, parent, false); FooterHolder fholder = new FooterHolder(fv); return fholder; } return null; } } class ItemHolder extends ViewHolder { public TextView mtv; public CheckBox mcb; public ItemHolder(View v) { super(v); // TODO Auto-generated constructor stub mtv = (TextView) v.findViewById(R.id.mtv); mcb=(CheckBox) v.findViewById(R.id.mcb); } } class FooterHolder extends ViewHolder { public ProgressBar mpb; public TextView mtv; public FooterHolder(View v) { super(v); // TODO Auto-generated constructor stub mpb = (ProgressBar) v.findViewById(R.id.mpb); mtv = (TextView) v.findViewById(R.id.mtv); } }
然后就是MainActivity中的代码:
package com.example.cn.bgs.swiprecycleviewdemo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.OnScrollListener; import android.view.Menu; public class MainActivity extends Activity { private RecyclerView mrv; private SwipeRefreshLayout mswip; private MyAdapter adapter; //判断是否加载数据 private boolean isLoading; //当前页面能见的最后一个item的id private int lastId; private int state; private LinearLayoutManager linearManager; //能显示的数据最大值 private int maxSize = 48; //底部视图的两种状态 private static final int LOADING = 3; private static final int NO_MORE = 4; private List<String> list = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mrv = (RecyclerView) findViewById(R.id.mrv); linearManager = new LinearLayoutManager(this); mswip = (SwipeRefreshLayout) findViewById(R.id.mswip); list = new ArrayList<String>(); for (int i = 0; i < 20; i++) { list.add("item" + i); } adapter = new MyAdapter(this, list); mrv.setAdapter(adapter); mrv.setLayoutManager(linearManager); mswip.setColorSchemeResources(R.color.color1, R.color.color2, R.color.color3, R.color.color4); //下拉刷新的监听 mswip.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { // TODO Auto-generated method stub new Handler().postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 5; i > 0; i--) { list.add(0, "new item" + i); } adapter.notifyDataSetChanged(); mswip.setRefreshing(false); } }, 3000); } }); //上拉加载的监听 mrv.setOnScrollListener(new OnScrollListener() { @Override public void onScrolled(int arg0, int arg1) { // TODO Auto-generated method stub //mrv滑动的时候会回调这个方法 lastId = linearManager.findLastVisibleItemPosition(); } @Override public void onScrollStateChanged(int arg0) { // TODO Auto-generated method stub //判断是否是最后一条 if (lastId + 1 == adapter.getItemCount() && state == RecyclerView.SCROLL_STATE_IDLE && !isLoading) { isLoading = true; final int count = adapter.getItemCount(); new Handler().postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub //判断是否加载到最大值了 if (count + 10 < maxSize) { for (int i = count; i < count + 10; i++) { list.add("load more" + i); } adapter.notifyDataSetChanged(); } else { for (int i = count; i < maxSize; i++) { list.add("load more" + i); } adapter.setloadState(NO_MORE); 4000 } isLoading = false; } }, 3000); } } }); } }
以上四篇文章就是我对recycler v iew的了解,如有不足或者欠缺的地方,还望多多指教。
相关文章推荐
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- RecyclerView的简单使用,实现下拉刷新、上拉加载
- 【Android实战】----RecyclerView下拉刷新和上拉加载的简单实现
- Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新
- Android v7使用 RecyclerView ¬----之一简单实现
- Android中使用RecyclerView实现下拉刷新和上拉加载
- Android使用RecyclerView实现上拉加载更多,下拉刷新,分组显示
- Android-RecyclerView使用(三) 实现下拉刷新,上拉自动加载
- Android App使用RecyclerView实现上拉和下拉刷新的方法
- android 简单实现 RecyclerView 下拉刷新上拉加载
- Android RecyclerView加载不同布局简单实现
- Android:RecyclerView视图,item之间分割线的极简单实现
- Android中使用RecyclerView和CardView实现瀑布流效果(StaggeredGrid)
- (4.1.11.1)Android中使用RecyclerView和CardView实现瀑布流效果(StaggeredGrid)
- Android之RecyclerView简单使用(一)
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多
- Android之RecyclerView简单使用(二)