博客
关于我
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/

你可能感兴趣的文章
连接Oracle数据库经常报错?关于listener.ora和tnsnames.ora文件的配置
查看>>
解决数据库报ORA-02289:序列不存在错误
查看>>
map[]和map.at()取值之间的区别
查看>>
成功解决升级virtualenv报错问题
查看>>
【SQLI-Lab】靶场搭建
查看>>
Xception 设计进化
查看>>
【Bootstrap5】精细学习记录
查看>>
SkyWalking性能剖析
查看>>
LeetCode197.打家劫舍
查看>>
A simple problem HDU-2522 【数学技巧】
查看>>
487-3279 POJ-1022【前导0~思维漏洞】
查看>>
Struts2-从值栈获取list集合数据(三种方式)
查看>>
vscode中快速生成vue模板
查看>>
QT报make: Circular all <- first dependency dropped.错误解决。
查看>>
demo---购物车的多条记录保存(cookie)
查看>>
参考图像
查看>>
*.json: [“usingComponents“][“van-button“] 未找到
查看>>
设计模式(18)——中介者模式
查看>>
用JavaScript实现希尔排序
查看>>
python初学者容易犯的错误
查看>>