返回介绍

SwipeRefreshLayout

发布于 2024-12-23 22:23:37 字数 7309 浏览 0 评论 0 收藏 0

SwipeRefreshLayout 是 Android 提供的一种用于下拉刷新(Pull-to-Refresh)功能的组件。它常用于列表(如 RecyclerViewListView )或其他可滚动的视图中,用户可以通过下拉手势刷新数据。


主要功能

  1. 下拉刷新指示器:显示一个可定制的刷新动画。
  2. 手势支持:通过手势触发刷新操作。
  3. 与可滚动视图的兼容性:通常与 RecyclerViewListView 配合使用。
  4. 刷新状态控制:支持手动启动或停止刷新。

基本用法

布局文件

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

活动代码

import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private SwipeRefreshLayout swipeRefreshLayout;
    private RecyclerView recyclerView;
    private MyAdapter adapter;
    private List<String> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化视图
        swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout);
        recyclerView = findViewById(R.id.recycler_view);

        // 初始化数据
        data = new ArrayList<>();
        for (int i = 1; i <= 20; i++) {
            data.add("Item " + i);
        }

        // 设置 RecyclerView
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new MyAdapter(data);
        recyclerView.setAdapter(adapter);

        // 设置 SwipeRefreshLayout
        swipeRefreshLayout.setOnRefreshListener(() -> {
            // 模拟加载数据
            new Handler().postDelayed(() -> {
                data.add(0, "New Item " + (data.size() + 1));
                adapter.notifyDataSetChanged();
                swipeRefreshLayout.setRefreshing(false); // 停止刷新动画
                Toast.makeText(MainActivity.this, "Data refreshed", Toast.LENGTH_SHORT).show();
            }, 2000); // 模拟 2 秒的刷新延迟
        });
    }
}

适配器代码

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private final List<String> data;

    public MyAdapter(List<String> data) {
        this.data = data;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(android.R.layout.simple_list_item_1, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.textView.setText(data.get(position));
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        ViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(android.R.id.text1);
        }
    }
}

主要方法和属性

方法/属性说明
setOnRefreshListener设置刷新监听器,用于触发刷新操作。
setRefreshing(boolean)手动启动或停止刷新动画。
isRefreshing()检查是否正在刷新状态。
setColorSchemeColors(int...)设置刷新指示器的颜色。
setProgressBackgroundColorSchemeColor(int)设置刷新指示器背景颜色。

高级用法

  1. 自定义刷新指示器颜色
   swipeRefreshLayout.setColorSchemeColors(
       getResources().getColor(R.color.colorPrimary),
       getResources().getColor(R.color.colorAccent),
       getResources().getColor(R.color.colorPrimaryDark)
   );
  1. 自定义触发位置
   swipeRefreshLayout.setDistanceToTriggerSync(200); // 默认值为 120
  1. 结合非滚动视图 如果需要支持非滚动视图,可以使用 setEnabled(false) 手动控制触发逻辑。

注意事项

  • 嵌套滚动冲突: 如果 SwipeRefreshLayout 内部嵌套了其他带滚动功能的视图(如 RecyclerView ),确保其滚动行为正确响应。
  • 避免过度刷新: 在回调方法中,避免刷新操作过于频繁。
  • UI 性能优化: 长时间的刷新操作可能影响用户体验,建议在刷新时提供视觉反馈,并设置适当的超时时间。

这个示例展示了一个完整的 SwipeRefreshLayout 使用过程,包括下拉刷新和数据更新,适合初学者和中级开发者参考。如果需要更复杂的实现,可以进一步扩展逻辑。


SwipeRefreshLayout 是一个下拉刷新控件,几乎可以包裹一个任何可以滚动的内容(ListView GridView ScrollView RecyclerView),可以自动识别垂直滚动手势。使用起来非常方便。

1. 将需要下拉刷新的空间包裹起来

<android.support.v4.widget.SwipeRefreshLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</android.support.v4.widget.SwipeRefreshLayout>

2. 设置刷新动画的触发回调

//设置下拉出现小圆圈是否是缩放出现,出现的位置,最大的下拉位置
mySwipeRefreshLayout.setProgressViewOffset(true, 50, 200);

//设置下拉圆圈的大小,两个值 LARGE, DEFAULT
mySwipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE);

// 设置下拉圆圈上的颜色,蓝色、绿色、橙色、红色
mySwipeRefreshLayout.setColorSchemeResources(
  android.R.color.holo_blue_bright,
  android.R.color.holo_green_light,
  android.R.color.holo_orange_light,
  android.R.color.holo_red_light);

// 通过 setEnabled(false) 禁用下拉刷新
mySwipeRefreshLayout.setEnabled(false);

// 设定下拉圆圈的背景
mSwipeLayout.setProgressBackgroundColor(R.color.red);

/*
 * 设置手势下拉刷新的监听
 */
mySwipeRefreshLayout.setOnRefreshListener(
  new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
      // 刷新动画开始后回调到此方法
    }
  }
);

通过 setRefreshing(false)setRefreshing(true) 来手动调用刷新的动画。

onRefresh 的回调只有在手势下拉的情况下才会触发,通过 setRefreshing 只能调用刷新的动画是否显示。 SwipeRefreshLayout 也可放在 CoordinatorLayout 内共同处理滑动冲突,有兴趣可以尝试。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文