时间:2021-05-20
推荐阅读:使用RecyclerView添加Header和Footer的方法
RecyclerView的使用之HelloWorld
RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。本文给大家介绍如何为RecyclerView添加下拉刷新和上拉加载,过去在ListView当中添加下拉刷新和上拉加载是非常方便的利用addHeaderView和addFooterView,RecyclerView的刷新同样也是需要靠List当中添加Head或Foot来实现的。本篇不会详细告诉你怎么去做一个下拉刷新和加载的效果,而是如何快速利用现有的知名开源库来为RecyclerView实现下面的效果。
先给大家展示下效果图,感兴趣的朋友请继续阅读全文。
这个下拉刷新不是靠List当中添加HeaderView来实现的,而是在RecyclerView外面套了一层ViewGroup而这个ViewGroup支持下拉刷新,可以灵巧的实现一些子View的下拉刷新,这个就是大名鼎鼎的android-Ultra-Pull-To-Refresh开源库,作者liaohuqiu,但是很遗憾它不支持上拉加载,本篇用的是在这个库基础上进行了拓展并实现了上拉加载效果的开源库,上拉的效果实现是靠RecyclerView里添加FooterView,Github地址:https://github.com/Chanven/CommonPullToRefresh 感谢活跃在开源社区的开发者们。
具体的实现步骤:(开发工具:Android Studio)
1:Gradle配置 build.gradle
//可选 或者在上面地址中下载library源代码copy到项目里面compile 'com.chanven.lib:cptr:1.0.0' // RecyclerView和CardViewcompile 'com.android.support:recyclerview-v7:23.1.1'compile 'com.android.support:cardview-v7:23.1.1'2:主布局文件 activity_main.xml 里面一个RecyclerView 外面嵌套的是支持下拉刷新的ViewGroup
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.chanven.lib.cptr.PtrClassicFrameLayoutandroid:id="@+id/rotate_header_list_view_frame"xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#e1e1e1"cube_ptr:ptr_duration_to_close="200"cube_ptr:ptr_duration_to_close_header="1000"cube_ptr:ptr_keep_header_when_refresh="true"cube_ptr:ptr_pull_to_fresh="false"cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"cube_ptr:ptr_resistance="1.7"><android.support.v7.widget.RecyclerViewandroid:background="#ffffff"xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/rv_list"/></com.chanven.lib.cptr.PtrClassicFrameLayout></LinearLayout>3:列表项布局 rv_item.xml 外面一个CardView的卡片式容器,里面一个TextView
<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardViewxmlns:card_view="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="8dp"android:id="@+id/cv_item"android:foreground="?android:attr/selectableItemBackground"card_view:cardCornerRadius="4dp"card_view:cardElevation="4dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv_item_text"android:text="test"android:layout_margin="8dp"/></LinearLayout></android.support.v7.widget.CardView>4:RecyclerView的Adapter RvAdapter.java
public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private LayoutInflater mLayoutInflater;private Context mContext;private List <String> mTitle;public RvAdapter(Context context,List<String> title){mContext=context;mTitle=title;mLayoutInflater=LayoutInflater.from(context);}//自定义的ViewHolder,持有每个Item的的所有界面元素public static class NormalViewHolder extends RecyclerView.ViewHolder {TextView mTextView;CardView mCardView;public NormalViewHolder(View itemView) {super(itemView);mTextView=(TextView)itemView.findViewById(R.id.tv_item_text);mCardView=(CardView)itemView.findViewById(R.id.cv_item);}}//在该方法中我们创建一个ViewHolder并返回,ViewHolder必须有一个带有View的构造函数,这个View就是我们Item的根布局,在这里我们使用自定义Item的布局;@Overridepublic NormalViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return new NormalViewHolder(mLayoutInflater.inflate(R.layout.rv_item,parent,false));}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {NormalViewHolder viewholder = (NormalViewHolder) holder;viewholder.mTextView.setText(mTitle.get(position));}//获取数据的数量@Overridepublic int getItemCount() {return mTitle==null ? 0 : mTitle.size();}}5:最重要的Activity的实现,MainActivity.java,代码含义已经注释
public class MainActivity extends AppCompatActivity {private RecyclerView mRecyclerView;//支持下拉刷新的ViewGroupprivate PtrClassicFrameLayout mPtrFrame;//List数据private List<String> title = new ArrayList<>();//RecyclerView自定义Adapterprivate RvAdapter adapter;//添加Header和Footer的封装类private RecyclerAdapterWithHF mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mRecyclerView = (RecyclerView) findViewById(R.id.rv_list);LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);mRecyclerView.setLayoutManager(layoutManager);adapter = new RvAdapter(MainActivity.this, title);mAdapter = new RecyclerAdapterWithHF(adapter);mRecyclerView.setAdapter(mAdapter);mPtrFrame = (PtrClassicFrameLayout) findViewById(R.id.rotate_header_list_view_frame);//下拉刷新支持时间mPtrFrame.setLastUpdateTimeRelateObject(this);//下拉刷新一些设置 详情参考文档mPtrFrame.setResistance(1.7f);mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f);mPtrFrame.setDurationToClose(200);mPtrFrame.setDurationToCloseHeader(1000);// default is falsemPtrFrame.setPullToRefresh(false);// default is truemPtrFrame.setKeepHeaderWhenRefresh(true);//进入Activity就进行自动下拉刷新mPtrFrame.postDelayed(new Runnable() {@Overridepublic void run() {mPtrFrame.autoRefresh();}}, 100);//下拉刷新mPtrFrame.setPtrHandler(new PtrDefaultHandler() {@Overridepublic void onRefreshBegin(PtrFrameLayout frame) {title.clear();//模拟数据for (int i = 0; i <= 5; i++) {title.add(String.valueOf(i));}//模拟联网 延迟更新列表new Handler().postDelayed(new Runnable() {public void run() {mAdapter.notifyDataSetChanged();mPtrFrame.refreshComplete();mPtrFrame.setLoadMoreEnable(true);}}, 1000);}});//上拉加载mPtrFrame.setOnLoadMoreListener(new OnLoadMoreListener() {@Overridepublic void loadMore() {//模拟联网延迟更新数据new Handler().postDelayed(new Runnable() {@Overridepublic void run() {//模拟数据for (int i = 0; i <= 5; i++) {title.add(String.valueOf(i));}mAdapter.notifyDataSetChanged();mPtrFrame.loadMoreComplete(true);Toast.makeText(MainActivity.this, "load more complete", Toast.LENGTH_SHORT).show();}}, 1000);}});}}以上内容是小编给大家介绍的Android中使用RecyclerView实现下拉刷新和上拉加载教程,希望对大家有所帮助!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了Android实现下拉刷新和上拉加载更多的具体代码,供大家参考,具体内容如下先分享下源码:Android实现下拉刷新和上拉加载更多实现思路:
本文实例为大家分享了Spring实现上拉刷新和下拉加载效果,供大家参考,具体内容如下导依赖:compile'com.android.support:recycl
本文介绍了react-nativeListView下拉刷新上拉加载实现。分享给大家,具体如下:先看效果图下拉刷新ReactNative提供了一个组件可以实现下拉
之前写过一篇刷新加载《RecyclerView上拉加载和下拉刷新(基础版)》,这次是进行改装完善。代码中注释的很详细,所以就直接上代码了。核心实现package
本文介绍了Flutter实现下拉刷新上拉加载的示例代码,分享给大家,具体如下:效果图使用方法添加依赖dependencies:pull_to_refresh:^