- CompoundButton 源码分析
- LinearLayout 源码分析
- SearchView 源码解析
- LruCache 源码解析
- ViewDragHelper 源码解析
- BottomSheets 源码解析
- Media Player 源码分析
- NavigationView 源码解析
- Service 源码解析
- Binder 源码分析
- Android 应用 Preference 相关及源码浅析 SharePreferences 篇
- ScrollView 源码解析
- Handler 源码解析
- NestedScrollView 源码解析
- SQLiteOpenHelper/SQLiteDatabase/Cursor 源码解析
- Bundle 源码解析
- LocalBroadcastManager 源码解析
- Toast 源码解析
- TextInputLayout
- LayoutInflater 和 LayoutInflaterCompat 源码解析
- TextView 源码解析
- NestedScrolling 事件机制源码解析
- ViewGroup 源码解析
- StaticLayout 源码分析
- AtomicFile 源码解析
- AtomicFile 源码解析
- Spannable 源码分析
- Notification 之 Android 5.0 实现原理
- CoordinatorLayout 源码分析
- Scroller 源码解析
- SwipeRefreshLayout 源码分析
- FloatingActionButton 源码解析
- AsyncTask 源码分析
- TabLayout 源码解析
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
SwipeRefreshLayout
SwipeRefreshLayout
是 Android 提供的一种用于下拉刷新(Pull-to-Refresh)功能的组件。它常用于列表(如 RecyclerView
、 ListView
)或其他可滚动的视图中,用户可以通过下拉手势刷新数据。
主要功能
- 下拉刷新指示器:显示一个可定制的刷新动画。
- 手势支持:通过手势触发刷新操作。
- 与可滚动视图的兼容性:通常与
RecyclerView
或ListView
配合使用。 - 刷新状态控制:支持手动启动或停止刷新。
基本用法
布局文件
<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) | 设置刷新指示器背景颜色。 |
高级用法
- 自定义刷新指示器颜色
swipeRefreshLayout.setColorSchemeColors(
getResources().getColor(R.color.colorPrimary),
getResources().getColor(R.color.colorAccent),
getResources().getColor(R.color.colorPrimaryDark)
);
- 自定义触发位置
swipeRefreshLayout.setDistanceToTriggerSync(200); // 默认值为 120
- 结合非滚动视图 如果需要支持非滚动视图,可以使用
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论