Android 使用SwipeRefreshLayout实现RecyclerVeiw的下拉刷新和上拉加载
发布日期:2021-05-14 09:14:29 浏览次数: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中替换为网络请求逻辑。

上一篇:Android 中使用bundle.putExtra实现Activity之间的参数传递
下一篇:Java面向对象 接口(interface)的详解

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月13日 03时15分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章