博客
关于我
Android 使用SwipeRefreshLayout实现RecyclerVeiw的下拉刷新和上拉加载
阅读量:574 次
发布时间:2019-03-11

本文共 7329 字,大约阅读时间需要 24 分钟。

在Android应用中实现下拉刷新和上拉加载功能,可以按照以下步骤进行:

一、布局文件代码主界面main.xml:

列表项布局(项数布局):

底部footView布局:

二、后台代码逻辑适配器MyAdapter:

public class MyAdapter extends RecyclerView.Adapter {    private List
datas; private Context context; private int normalType = 0; private int footType = 1; private boolean hasMore = true; private Handler mHandler = new Handler(Looper.getMainLooper()); public MyAdapter(List
datas, Context context, boolean hasMore) { this.datas = datas; this.context = context; this.hasMore = hasMore; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == normalType) { return new NormalHolder(LayoutInflater.from(context).inflate(R.layout.item, null)); } else { return new FootHolder(LayoutInflater.from(context).inflate(R.layout.footview, null)); } } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { if (holder instanceof NormalHolder) { ((NormalHolder) holder).textView.setText(datas.get(position)); } else { ((FootHolder) holder).tips.setVisibility(View.VISIBLE); if (hasMore) { if (!datas.isEmpty()) { ((FootHolder) holder).tips.setText("正在加载更多..."); } } else { if (!datas.isEmpty()) { ((FootHolder) holder).tips.setText("没有更多数据了"); mHandler.postDelayed(new Runnable() { @Override public void run() { ((FootHolder) holder).tips.setVisibility(View.GONE); hasMore = true; } }, 500); } } } } @Override public int getItemCount() { return datas.size() + 1; } @Override public int getRealLastPosition() { return datas.size(); } public void updateList(List
newDatas, boolean hasMore) { if (newDatas != null) { datas.addAll(newDatas); } this.hasMore = hasMore; notifyDataSetChanged(); } class NormalHolder extends RecyclerView.ViewHolder { private TextView textView; public NormalHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.tv); } } class FootHolder extends RecyclerView.ViewHolder { private TextView tips; public FootHolder(View itemView) { super(itemView); tips = (TextView) itemView.findViewById(R.id.tips); } } public boolean isFadeTips() { return fadeTips; } public void resetDatas() { datas = new ArrayList<>(); } @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return footType; } else { return normalType; } }}

MainActivity:

public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {    private SwipeRefreshLayout refreshLayout;    private RecyclerView recyclerView;    private List
list; private int lastVisibleItem = 0; private final int PAGE_COUNT = 30; private GridLayoutManager mLayoutManager; private MyAdapter adapter; private Handler mHandler = new Handler(Looper.getMainLooper()); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); findView(); initRefreshLayout(); initRecyclerView(); } private void initData() { list = new ArrayList<>(); for (int i = 1; i <= 60; i++) { list.add("条目" + i); } } private void findView() { refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refreshLayout); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); } private void initRefreshLayout() { refreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light); refreshLayout.setOnRefreshListener(this); } private void initRecyclerView() { adapter = new MyAdapter(getDatas(0, PAGE_COUNT), this, getDatas(0, PAGE_COUNT).size() > 0 ? true : false); mLayoutManager = new GridLayoutManager(this, 1); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setAdapter(adapter); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { if (!adapter.isFadeTips() && lastVisibleItem + 1 == adapter.getItemCount()) { mHandler.postDelayed(new Runnable() { @Override public void run() { updateRecyclerView(adapter.getRealLastPosition(), adapter.getRealLastPosition() + PAGE_COUNT); } }, 500); } if (adapter.isFadeTips() && lastVisibleItem + 2 == adapter.getItemCount()) { mHandler.postDelayed(new Runnable() { @Override public void run() { updateRecyclerView(adapter.getRealLastPosition(), adapter.getRealLastPosition() + PAGE_COUNT); } }, 500); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); lastVisibleItem = mLayoutManager.findLastVisibleItemPosition(); } }); } private List
getDatas(final int firstIndex, final int lastIndex) { List
resList = new ArrayList<>(); for (int i = firstIndex; i < lastIndex; i++) { if (i < list.size()) { resList.add(list.get(i)); } } return resList; } private void updateRecyclerView(int fromIndex, int toIndex) { List
newDatas = getDatas(fromIndex, toIndex); if (newDatas.size() > 0) { adapter.updateList(newDatas, true); } else { adapter.updateList(null, false); } } @Override public void onRefresh() { refreshLayout.setRefreshing(true); adapter.resetDatas(); updateRecyclerView(0, PAGE_COUNT); mHandler.postDelayed(new Runnable() { @Override public void run() { refreshLayout.setRefreshing(false); } }, 1000); }}

以上代码实现了下拉刷新和上拉加载功能,可以根据实际需求调整数据获取方式。如果需要网络数据获取,请在Main Activity中替换为网络请求逻辑。

转载地址:http://iarvz.baihongyu.com/

你可能感兴趣的文章
83. Remove Duplicates from Sorted List
查看>>
Oracle Orion tool check io(ORACLE Orion 工具查看以及校验IO)
查看>>
centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
查看>>
MySQL 1064 You have an error in your SQL syntax 错误解决办法
查看>>
【Flink】Flink 底层RPC框架分析
查看>>
MySQL错误日志(Error Log)
查看>>
C++高精度模板
查看>>
解决:angularjs radio默认选中失效问题
查看>>
windows环境下安装zookeeper(仅本地使用)
查看>>
缓冲区溢出实例(一)--Windows
查看>>
PHP一句话木马小总结与SQL语句写一句话木马
查看>>
Python中字符串前添加r ,b, u, f前缀的含义
查看>>
Hadoop学习笔记—Yarn
查看>>
JSONPath小试牛刀之Snack3
查看>>
Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
查看>>
wxWidgets源码分析(3) - 消息映射表
查看>>
wxWidgets源码分析(5) - 窗口管理
查看>>
wxWidgets源码分析(7) - 窗口尺寸
查看>>
wxWidgets源码分析(8) - MVC架构
查看>>
wxWidgets源码分析(9) - wxString
查看>>