Android之下拉与上拉刷新
来源:互联网 发布:top域名有人用吗 编辑:程序博客网 时间:2024/04/27 23:47
转载请注明出处:http://blog.csdn.net/loveyaozu/article/details/51240525
Android日常开发中,对于下拉与上拉刷新控件的使用非常之频繁。一般都会采用第三方库,但是下拉刷新做到简单优雅并不是太多,甚至有的兼容性都存在问题。这个是不能接受的。最近在github上面看到一位哥们提供的下拉刷新的库非常不错,非常简洁。所以今天把它推荐给大家,供大家日常开发使用。文章结尾会给大家提供Demo供各位下载参考使用。
Demo中一共提供四种下拉/上拉刷新。ListView的下拉/上拉刷新,GridView的下拉/上拉刷新,RecycleView的下拉/上拉刷新,SwipeRefreshLayout与ListView组合的下拉/上拉刷新。
Demo分为三个部分:RecycleView的jar包(之前RecycleView的包Google把它放在v7下面的,不知道为什么现在没有,所以单独放了一个RecycleViewjar包),第三方库CommonPullToRefresh_Lib(这个在实际开发中可以把它做成jar包,放到工程的libs下面),以及Demo工程。
工程目录结构:
从工程的目录结构中可以看到只有GridViewAtivity,ListViewActivity,MainActivity,RecyclerViewActivity,SwipeListViewActivity这五个Activity。其中MainActivity是启动界面,菜单列表。看上去没有什么额外的东西,相对还是比较简洁的。
activity_main.xml布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin" android:gravity="center_horizontal" android:background="@android:color/white" android:orientation="vertical" tools:context=".MainActivity" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:onClick="goListView" android:textAllCaps="false" android:text="@string/listView_with_loadmore" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:onClick="goRecyclerView" android:text="@string/recyclerview_with_loadmore" android:textAllCaps="false" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:onClick="goGridView" android:text="@string/gridview_with_loadmore" android:textAllCaps="false" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:onClick="goSwipeListView" android:text="@string/swipe_listview_with_loadmore" android:textAllCaps="false" /> </LinearLayout>
MainActivity
package com.syz.pullrefresh;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;/** * @author syz * @date 2016-4-24 */public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void goListView(View view) { startActivity(new Intent(this, ListViewActivity.class)); } public void goRecyclerView(View view) { startActivity(new Intent(this, RecyclerViewActivity.class)); } public void goGridView(View view) { startActivity(new Intent(this, GridViewAtivity.class)); } public void goSwipeListView(View view) { startActivity(new Intent(this, SwipeListViewActivity.class)); }}
效果图:
listview_layout.xml布局:
<?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" android:orientation="vertical" > <com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout xmlns:cube_ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/test_list_view_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f0f0f0" cube_ptr:ptr_duration_to_close="200" cube_ptr:ptr_duration_to_close_header="700" 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.8" > <ListView android:id="@+id/test_list_view" android:layout_width="match_parent" android:layout_height="match_parent" android:dividerHeight="0.1dp" android:background="@android:color/white" android:divider="#b0b0b0" android:choiceMode="singleChoice" android:fadingEdge="none" android:scrollbarStyle="outsideOverlay" /> </com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout></LinearLayout>
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:textColor="@android:color/black" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:minHeight="?android:attr/listPreferredItemHeightSmall" />
ListViewActivity
/*Copyright 2015 chanvenLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. */package com.syz.pullrefresh;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout;import com.syz.commonpulltorefresh.lib.PtrDefaultHandler;import com.syz.commonpulltorefresh.lib.PtrFrameLayout;import com.syz.commonpulltorefresh.lib.loadmore.OnLoadMoreListener;/** * ListView with loadmore * * @author syz * @date 2015-9-21 */public class ListViewActivity extends Activity { PtrClassicFrameLayout ptrClassicFrameLayout; ListView mListView; private List<String> mData = new ArrayList<String>(); private ListViewAdapter mAdapter; Handler handler = new Handler(); int page = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_layout); ptrClassicFrameLayout = (PtrClassicFrameLayout) this.findViewById(R.id.test_list_view_frame); mListView = (ListView) this.findViewById(R.id.test_list_view); initData(); } private void initData() { mAdapter = new ListViewAdapter(this, mData); mListView.setAdapter(mAdapter); ptrClassicFrameLayout.postDelayed(new Runnable() { @Override public void run() { ptrClassicFrameLayout.autoRefresh(true); } }, 150); ptrClassicFrameLayout.setPtrHandler(new PtrDefaultHandler() { @Override public void onRefreshBegin(PtrFrameLayout frame) { handler.postDelayed(new Runnable() { @Override public void run() { page = 0; mData.clear(); for (int i = 0; i < 17; i++) { mData.add(new String(" ListView item ——" + i)); } mAdapter.notifyDataSetChanged(); ptrClassicFrameLayout.refreshComplete(); ptrClassicFrameLayout.setLoadMoreEnable(true); } }, 1000); } }); ptrClassicFrameLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void loadMore() { handler.postDelayed(new Runnable() { @Override public void run() { mData.add(new String(" ListView item - add " + page)); mAdapter.notifyDataSetChanged(); ptrClassicFrameLayout.loadMoreComplete(true); page++; Toast.makeText(ListViewActivity.this, "load more complete", Toast.LENGTH_SHORT) .show(); } }, 1000); } }); } public class ListViewAdapter extends BaseAdapter { private List<String> datas; private LayoutInflater inflater; public ListViewAdapter(Context context, List<String> data) { super(); inflater = LayoutInflater.from(context); datas = data; } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.listitem_layout, parent, false); } TextView textView = (TextView) convertView; textView.setText(datas.get(position)); return convertView; } public List<String> getData() { return datas; } }}
效果图:
girdview_layout.xml布局:
<?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" android:orientation="vertical" > <com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout xmlns:cube_ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/test_grid_view_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f0f0f0" cube_ptr:ptr_duration_to_close="200" cube_ptr:ptr_duration_to_close_header="700" 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.8" > <com.syz.commonpulltorefresh.lib.loadmore.GridViewWithHeaderAndFooter android:id="@+id/test_grid_view" android:layout_width="match_parent" android:layout_height="match_parent" android:dividerHeight="0.1dp" android:background="@android:color/white" android:divider="#b0b0b0" android:choiceMode="singleChoice" android:fadingEdge="none" android:numColumns="4" android:scrollbarStyle="outsideOverlay" /> </com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout></LinearLayout>
GridViewAtivity
/*Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. */package com.syz.pullrefresh;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import android.widget.Toast;import com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout;import com.syz.commonpulltorefresh.lib.PtrDefaultHandler;import com.syz.commonpulltorefresh.lib.PtrFrameLayout;import com.syz.commonpulltorefresh.lib.loadmore.GridViewWithHeaderAndFooter;import com.syz.commonpulltorefresh.lib.loadmore.OnLoadMoreListener;/** * GridView with loadmore * * @author syz * @date 2015-10-13 */public class GridViewAtivity extends Activity { PtrClassicFrameLayout ptrClassicFrameLayout; GridViewWithHeaderAndFooter mGridView; GridViewAdapter mAdapter; private List<String> mData = new ArrayList<String>(); Handler handler = new Handler(); int page = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.girdview_layout); ptrClassicFrameLayout = (PtrClassicFrameLayout) this.findViewById(R.id.test_grid_view_frame); mGridView = (GridViewWithHeaderAndFooter) this.findViewById(R.id.test_grid_view); initData(); } private void initData() { mAdapter = new GridViewAdapter(this, mData); mGridView.setAdapter(mAdapter); ptrClassicFrameLayout.postDelayed(new Runnable() { @Override public void run() { ptrClassicFrameLayout.autoRefresh(true); } }, 150); ptrClassicFrameLayout.setPtrHandler(new PtrDefaultHandler() { @Override public void onRefreshBegin(PtrFrameLayout frame) { handler.postDelayed(new Runnable() { @Override public void run() { page = 0; mData.clear(); for (int i = 0; i < 40; i++) { mData.add(new String("GridView item ——" + i)); } mAdapter.notifyDataSetChanged(); ptrClassicFrameLayout.refreshComplete(); ptrClassicFrameLayout.setLoadMoreEnable(true); } }, 1000); } }); ptrClassicFrameLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void loadMore() { handler.postDelayed(new Runnable() { @Override public void run() { for (int i = 0; i < 4; i++) { mData.add(new String("GridView item -- add" + page)); } mAdapter.notifyDataSetChanged(); ptrClassicFrameLayout.loadMoreComplete(true); page++; Toast.makeText(GridViewAtivity.this, "load more complete", Toast.LENGTH_SHORT) .show(); } }, 1000); } }); } public class GridViewAdapter extends BaseAdapter { private List<String> datas; private LayoutInflater inflater; public GridViewAdapter(Context context, List<String> data) { super(); inflater = LayoutInflater.from(context); datas = data; } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.listitem_layout, parent, false); } TextView textView = (TextView) convertView; textView.setText(datas.get(position)); return convertView; } public List<String> getData() { return datas; } }}
效果图:
recyclerview_layout.xml布局
<?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" android:orientation="vertical" > <com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout xmlns:cube_ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/test_recycler_view_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f0f0f0" cube_ptr:ptr_duration_to_close="200" cube_ptr:ptr_duration_to_close_header="700" 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.8" > <android.support.v7.widget.RecyclerView android:id="@+id/test_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white"/> </com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout></LinearLayout>
/*Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. */package com.syz.pullrefresh;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.Adapter;import android.support.v7.widget.RecyclerView.ViewHolder;import android.view.LayoutInflater;import android.view.View; import android.view.ViewGroup;import android.widget.TextView;import android.widget.Toast;import com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout;import com.syz.commonpulltorefresh.lib.PtrDefaultHandler;import com.syz.commonpulltorefresh.lib.PtrFrameLayout;import com.syz.commonpulltorefresh.lib.loadmore.OnLoadMoreListener;import com.syz.commonpulltorefresh.lib.recyclerview.RecyclerAdapterWithHF;/** * RecyclerView with loadmore * * @author syz * @date 2015-9-21 */public class RecyclerViewActivity extends Activity { PtrClassicFrameLayout ptrClassicFrameLayout; RecyclerView mRecyclerView; private List<String> mData = new ArrayList<String>(); private RecyclerAdapter adapter; private RecyclerAdapterWithHF mAdapter; Handler handler = new Handler(); int page = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recyclerview_layout); ptrClassicFrameLayout = (PtrClassicFrameLayout) this.findViewById(R.id.test_recycler_view_frame); mRecyclerView = (RecyclerView) this.findViewById(R.id.test_recycler_view); init(); } private void init() { adapter = new RecyclerAdapter(this, mData); mAdapter = new RecyclerAdapterWithHF(adapter); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(mAdapter); ptrClassicFrameLayout.postDelayed(new Runnable() { @Override public void run() { ptrClassicFrameLayout.autoRefresh(true); } }, 150); ptrClassicFrameLayout.setPtrHandler(new PtrDefaultHandler() { @Override public void onRefreshBegin(PtrFrameLayout frame) { handler.postDelayed(new Runnable() { @Override public void run() { page = 0; mData.clear(); for (int i = 0; i < 17; i++) { mData.add(new String(" RecyclerView item ——" + i)); } mAdapter.notifyDataSetChanged(); ptrClassicFrameLayout.refreshComplete(); ptrClassicFrameLayout.setLoadMoreEnable(true); } }, 2000); } }); ptrClassicFrameLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void loadMore() { handler.postDelayed(new Runnable() { @Override public void run() { mData.add(new String(" RecyclerView item - add " + page)); mAdapter.notifyDataSetChanged(); ptrClassicFrameLayout.loadMoreComplete(true); page++; Toast.makeText(RecyclerViewActivity.this, "load more complete", Toast.LENGTH_SHORT) .show(); } }, 1000); } }); } public class RecyclerAdapter extends Adapter<ViewHolder> { private List<String> datas; private LayoutInflater inflater; public RecyclerAdapter(Context context, List<String> data) { super(); inflater = LayoutInflater.from(context); datas = data; } @Override public int getItemCount() { return datas.size(); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { ChildViewHolder holder = (ChildViewHolder) viewHolder; holder.itemTv.setText(datas.get(position)); } @Override public ViewHolder onCreateViewHolder(ViewGroup viewHolder, int position) { View view = inflater.inflate(R.layout.listitem_layout, null); return new ChildViewHolder(view); } } public class ChildViewHolder extends ViewHolder { public TextView itemTv; public ChildViewHolder(View view) { super(view); itemTv = (TextView) view; } }}
效果图:
swipe_listview_layout.xml
<?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" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/sryt_swipe_listview" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/lv_swipe_listview" android:layout_width="match_parent" android:layout_height="match_parent" android:dividerHeight="0.1dp" android:background="@android:color/white" android:divider="#b0b0b0" android:choiceMode="singleChoice" android:fadingEdge="none" android:scrollbarStyle="outsideOverlay" /> </android.support.v4.widget.SwipeRefreshLayout></LinearLayout>
SwipeListViewActivity
package com.syz.pullrefresh;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.syz.commonpulltorefresh.lib.loadmore.OnLoadMoreListener;import com.syz.commonpulltorefresh.lib.loadmore.SwipeRefreshHelper;import com.syz.commonpulltorefresh.lib.loadmore.SwipeRefreshHelper.OnSwipeRefreshListener;/** * listView with load more in swipeRefreshLayout * Created by syz on 2015-11-5. */public class SwipeListViewActivity extends Activity{ private SwipeRefreshLayout mSryt; private ListView mListView; private List<String> mDatas = new ArrayList<String>(); private ListViewAdapter mAdapter; private SwipeRefreshHelper mSwipeRefreshHelper; private int page = 0; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.swipe_listview_layout); initView(); initData(); } private void initView() { mSryt = (SwipeRefreshLayout) this.findViewById(R.id.sryt_swipe_listview); mListView = (ListView) findViewById(R.id.lv_swipe_listview); mSryt.setColorSchemeColors(Color.BLUE); } private void initData() { mAdapter = new ListViewAdapter(this, mDatas); mListView.setAdapter(mAdapter); mSwipeRefreshHelper = new SwipeRefreshHelper(mSryt); mSryt.post(new Runnable() { @Override public void run() { mSwipeRefreshHelper.autoRefresh(); } }); mSwipeRefreshHelper.setOnSwipeRefreshListener(new OnSwipeRefreshListener() { @Override public void onfresh() { mHandler.postDelayed(new Runnable() { @Override public void run() { mDatas.clear(); page = 0; for (int i = 0; i < 17; i++) { mDatas.add(new String(" SwipeListView item ——" + i)); } mAdapter.notifyDataSetChanged(); mSwipeRefreshHelper.refreshComplete(); mSwipeRefreshHelper.setLoadMoreEnable(true); } }, 1000); } }); mSwipeRefreshHelper.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void loadMore() { mHandler.postDelayed(new Runnable() { @Override public void run() { mDatas.add(new String(" SwipeListView item - add " + page)); mAdapter.notifyDataSetChanged(); mSwipeRefreshHelper.loadMoreComplete(true); page++; Toast.makeText(SwipeListViewActivity.this, "load more complete", Toast.LENGTH_SHORT) .show(); } }, 1000); } }); } OnSwipeRefreshListener mOnSwipeRefreshListener = new OnSwipeRefreshListener() { @Override public void onfresh() { mHandler.postDelayed(new Runnable() { @Override public void run() { mDatas.clear(); page = 0; for (int i = 0; i < 17; i++) { mDatas.add(new String(" SwipeListView item -" + i)); } mAdapter.notifyDataSetChanged(); mSwipeRefreshHelper.refreshComplete(); mSwipeRefreshHelper.setLoadMoreEnable(true); } }, 1000); } }; public class ListViewAdapter extends BaseAdapter { private List<String> datas; private LayoutInflater inflater; public ListViewAdapter(Context context, List<String> data) { super(); inflater = LayoutInflater.from(context); datas = data; } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.listitem_layout, parent, false); } TextView textView = (TextView) convertView; textView.setText(datas.get(position)); return convertView; } public List<String> getData() { return datas; } }}效果图:
配置
有6个参数可配置:
阻尼系数
默认: 1.7f,越大,感觉下拉时越吃力。 mPtrFrame.setResistance(1.7f)
触发刷新时移动的位置比例
默认,1.2f,移动达到头部高度1.2倍时可触发刷新操作。 mPtrFrame.setRatioOfHeaderHeightToRefresh(1.2f)
回弹延时
默认 200ms,回弹到刷新高度所用时间。 mPtrFrame.setDurationToClose(200)
头部回弹时间
默认1000ms。 mPtrFrame.setDurationToCloseHeader(1000)
刷新是保持头部
默认值 true。 mPtrFrame.setKeepHeaderWhenRefresh(true)
下拉刷新 / 释放刷新
默认为释放刷新,即false。 mPtrFrame.setPullToRefresh(false)
除此之外也可以在XML布局文件中设置
<?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" android:orientation="vertical"> <com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout android:id="@+id/test_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="#f0f0f0" cube_ptr:ptr_resistance="1.7" cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2" 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"> <ListView android:id="@+id/test_list_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:choiceMode="singleChoice" android:divider="#b0b0b0" android:dividerHeight="0.1dp" android:fadingEdge="none" android:scrollbarStyle="outsideOverlay"/> </com.syz.commonpulltorefresh.lib.PtrClassicFrameLayout></LinearLayout>
Demo下载地址:http://download.csdn.net/detail/loveyaozu/9501643
参考:https://github.com/Chanven/CommonPullToRefresh
- Android之下拉与上拉刷新
- RecyclerView完全解析之下拉刷新与上拉加载
- UITableView之下拉刷新上拉加载
- Xamarin.Android之下拉刷新
- Xamarin.Android之下拉刷新
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
- RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
- RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout
- ios之下拉刷新上拉加载更多
- 微信小程序开发之下拉刷新 上拉加载
- 微信小程序开发之下拉刷新 上拉加载
- 012 - 微信小程序开发之下拉刷新 上拉加载
- 微信小程序之下拉加载和上拉刷新
- webapp之下拉刷新 上拉滚动 JS
- 微信小程序之下拉加载和上拉刷新
- 微信小程序之下拉加载,上拉刷新
- Android之下拉(上拉)刷新大合集(包括ListView、ExpandableListview、ScrollView、GridView等等)
- MySql以及navicat for mysql的安装
- 一看就会的侧方位停车技巧 见了就收了吧
- 机器学习之——判定边界和逻辑回归模型的代价函数
- 华为路由器选型及应用
- 响铃:SCRM 对比移动CRM,输赢全靠硬功夫
- Android之下拉与上拉刷新
- Web 1.0、2.0、3.0
- 利用Canvas实现Flappybird简陋游戏步骤
- Unity5.0 烘焙物体导入其他场景
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛--易彰彪的一张表
- Mysql常见问题
- 浮點數轉化8字節的16進制
- 关于GNS3常用命令
- 阿里分析型数据库ads学习记录