文章不好看?刷新!你让不感兴趣?刷新!...这些操作应该是我们在刷手机时较为常见的操作了,那我我们在Android里面应该怎么实现这样的效果呢?(效果如下所示)
首先,要能展示不同的内容,我们就得获取到不同的内容,而我这边只是简易的实现,所以本次示例的所有内容均来自本人mock的构造,请加以区分。具体的数据构造,网络请求数据以及获取数据本次就不过多演示(网络请求代码展示)(该部分可以先不看,先看后面的)
List<KeChenFragmentMessage.TotalDTO> totalDTOS = new ArrayList<>();
List<KeChenFragmentMessage.TotalDTO.Chatlist5DTO> chatList5 = new ArrayList<>();
List<KeChenFragmentMessage.TotalDTO.Chatlist6DTO> chatList6 = new ArrayList<>();
.......
Request request = new Request.Builder()
.url("https://dev.usemock.com/your_url")
.get()
.build();
OkHttpClient okHttpClient = new OkHttpClient();
// call对象发起请求
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
String result = response.body().string();
Log.i("test5",result);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Gson gson = new Gson();
KeChenFragmentMessage keChenFragmentMessage = gson.fromJson(result,KeChenFragmentMessage.class);
totalDTOS.addAll(keChenFragmentMessage.total);
chatList5.addAll(totalDTOS.get(0).chatlist5);
chatList6.addAll(totalDTOS.get(1).chatlist6);
myAdpater.notifyDataSetChanged();
}
});
}
});
接着,在我们拿到数据后,就需要用到SmartRefreshLayout啦
(简单介绍:SmartRefreshLayout 是一个用于 Android 平台的开源下拉刷新和上拉加载更多库。它提供了高度定制化的下拉刷新和上拉加载的功能,支持各种样式和效果的定制,可以很方便地集成到 Android 应用中,用于优化用户体验,增强应用的交互性。)
在使用SmartRefreshLayout之前我们需要在在gradle文件中添加
implementation ("io.github.scwang90:refresh-layout-kernel:2.1.0") //核心必须依赖
implementation ("io.github.scwang90:refresh-header-classics:2.1.0") //经典刷新头
implementation ("io.github.scwang90:refresh-header-radar:2.1.0") //雷达刷新头
implementation ("io.github.scwang90:refresh-header-falsify:2.1.0") //虚拟刷新头
implementation ("io.github.scwang90:refresh-header-material:2.1.0") //谷歌刷新头
implementation ("io.github.scwang90:refresh-header-two-level:2.1.0") //二级刷新头
implementation ("io.github.scwang90:refresh-footer-ball:2.1.0") //球脉冲加载
implementation ("io.github.scwang90:refresh-footer-classics:2.1.0")
如果使用 AndroidX 先在 gradle.properties 中添加
android.useAndroidX=true
android.enableJetifier=true
对于相应的xml布局文件的布局设置思路:在SmartRefreshLayout下面布置一个recycle view
准备工作做完后我们就只需要,写出以下代码便可简易实现效果
smartRefreshLayout = view.findViewById(R.id.smartlayout);
//设置下拉刷新样式
smartRefreshLayout.setRefreshHeader(new ClassicsHeader(getContext()));
smartRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
// 根据标志位切换数据集
if (showChatList5) {
// 清空 chatList5 并填充数据
chatList5.clear();
for (KeChenFragmentMessage.TotalDTO.Chatlist6DTO item : totalDTOS.get(1).chatlist6) {
KeChenFragmentMessage.TotalDTO.Chatlist5DTO newItem = new KeChenFragmentMessage.TotalDTO.Chatlist5DTO();
// 已知chatlist6 中的属性和 chatlist5 中的属性一样
newItem.url = item.url;
newItem.classname = item.classname;
newItem.price = item.price;
newItem.studyNum = item.studyNum;
chatList5.add(newItem);
}
// 切换标志位
showChatList5 = false;
} else {
// 清空 chatList5 并填充数据
chatList5.clear();
for (KeChenFragmentMessage.TotalDTO.Chatlist5DTO item : totalDTOS.get(0).chatlist5) {
KeChenFragmentMessage.TotalDTO.Chatlist5DTO newItem = new KeChenFragmentMessage.TotalDTO.Chatlist5DTO();
newItem.url = item.url;
newItem.classname = item.classname;
newItem.price = item.price;
newItem.studyNum = item.studyNum;
chatList5.add(newItem);
}
// 切换标志位
showChatList5 = true;
}
smartRefreshLayout.finishRefresh(500);
myAdpater.notifyDataSetChanged();
}
});
注意:本次示例的数据构造均为相同类型,具体需要实现其他逻辑效果只需要在onRefresh方法中编辑新的逻辑即可。