返回介绍

SwipeRefreshLayout

发布于 2024-12-23 22:23:37 字数 7309 浏览 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 内共同处理滑动冲突,有兴趣可以尝试。

发布评论

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