第三方架包下载地址:https://github.com/chrisbanes/Android-PullToRefresh
解压后使用其中的library
Activity_main.xml
<com.handmark.pulltorefresh.library.PullToRefreshGridView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/g_gv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="100dp"
android:gravity="center_horizontal"
android:horizontalSpacing="1dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="1dp"
ptr:ptrDrawable="@drawable/ic_launcher"
ptr:ptrMode="both" /> </RelativeLayout>
MainActivity.class
我们添加了一个属性:ptr:ptrMode=”both” ,意思:上拉和下拉都支持。
可选值为:disabled(禁用下拉刷新),pullFromStart(仅支持下拉刷新),pullFromEnd(仅支持上拉刷新),both(二者都支持),manualOnly(只允许手动触发)
当然了,如果你不喜欢在布局文件中指定,完全可以使用代码设置,在onCreate里面写:mPullRefreshListView.setMode(Mode.BOTH);//设置你需要的模式
当然了这是旋转的效果,一般常用的还有,一个箭头倒置的效果,其实也很简单,一个属性:
ptr:ptrAnimationStyle=”flip”
去掉 ptr:ptrDrawable=”@drawable/ic_launcher”这个属性,如果你希望用下图默认的箭头,你也可以自定义。
ptr:ptrAnimationStyle的取值:flip(翻转动画), rotate(旋转动画) 。
ptr:ptrDrawable则就是设置图标了。
设置了模式为双向都支持,当然必须为上拉和下拉分别设置回调,请看下面的代码:
package com.example.libin_yuekao;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.widget.GridView;
import android.widget.Toast;
import com.example.adapter.Gadapter;
import com.example.bean.Book;
import com.example.bean.Book.Bdata;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
import com.handmark.pulltorefresh.library.PullToRefreshGridView;
public class SecondsActivity extends Activity {
private PullToRefreshGridView gv;
private ArrayList<Bdata> list=new ArrayList< Bdata>();
private Gadapter adapter;
private int start=0;
private int down=0;
private MyAsyncTask m;
private String ca;
private HttpURLConnection conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seconds);
Intent intent = getIntent();
ca = intent.getStringExtra("ca");
gv = (PullToRefreshGridView) findViewById(R.id.g_gv);
m = new MyAsyncTask();
m.execute("http://apis.juhe.cn/goodbook/query?key=3e100e799d37b42ff2cdbecc67ecb12b&catalog_id="+ca+"&rn=0&rn=5" );
gv.setOnRefreshListener(new OnRefreshListener2<GridView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase refreshView) {
// TODO Auto-generated method stub
list.clear();
start+=1;
down=start;
m = new MyAsyncTask();
m.execute("http://apis.juhe.cn/goodbook/query?key=3e100e799d37b42ff2cdbecc67ecb12b&catalog_id="+ca+"&rn="+start+"&rn=5");
}
@Override
public void onPullUpToRefresh(PullToRefreshBase refreshView) {
// TODO Auto-generated method stub
down-=1;
if(down>=0){
m = new MyAsyncTask();
m.execute("http://apis.juhe.cn/goodbook/query?key=3e100e799d37b42ff2cdbecc67ecb12b&catalog_id="+ca+"&rn="+down+"&rn=5");
}else{
Toast.makeText(SecondsActivity.this, "到底喽", 0).show();
gv.onRefreshComplete();
}
}
});
}
class MyAsyncTask extends AsyncTask<String, String, ArrayList<Bdata>>{
@Override
protected ArrayList<Bdata> doInBackground(String... params) {
// TODO Auto-generated method stub
return getUrlData(params[0]);
}
@Override
protected void onPostExecute(ArrayList<Bdata> result) {
super.onPostExecute(result);
if(adapter==null){
adapter = new Gadapter(SecondsActivity.this,result);
gv.setAdapter(adapter);
} else{
adapter.notifyDataSetChanged();
gv.onRefreshComplete();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.second, menu);
return true;
}
public ArrayList<Bdata> getUrlData(String url) {
try {
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setReadTimeout(6000);
conn.setConnectTimeout(6000);
conn.setRequestMethod("GET");
if(conn.getResponseCode()==200){
InputStream is = conn.getInputStream();
int len;
byte[] arr=new byte[1024];
ByteArrayOutputStream baos=new ByteArrayOutputStream();
while((len=is.read(arr))!=-1){
baos.write(arr, 0, len);
}
Gson g=new Gson();
Book b=g.fromJson(baos.toString(), Book.class);
list.addAll(b.result.data);
}
} catch ( Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}
1、自定义下拉指示器文本内容等效果
可以在初始化完成mPullRefreshListView后,通过mPullRefreshListView.getLoadingLayoutProxy()可以得到一个ILoadingLayout对象,这个对象可以设置各种指示器中的样式、文本等。
在CODE上查看代码片派生到我的代码片
ILoadingLayout startLabels = mPullRefreshListView
.getLoadingLayoutProxy();
startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时
startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示
如果你比较细心,会发现,前面我们设置上次刷新时间已经用到了:
// Update the LastUpdatedLabel
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
现在的效果是:
2、默认是上拉和下拉的字同时改变的,如果我希望单独改变呢?
private void initIndicator()
{
ILoadingLayout startLabels = mPullRefreshListView
.getLoadingLayoutProxy(true, false);
startLabels.setPullLabel("你可劲拉,拉...");// 刚下拉时,显示的提示
startLabels.setRefreshingLabel("好嘞,正在刷新...");// 刷新时
startLabels.setReleaseLabel("你敢放,我就敢刷新...");// 下来达到一定距离时,显示的提示
ILoadingLayout endLabels = mPullRefreshListView.getLoadingLayoutProxy(
false, true);
endLabels.setPullLabel("你可劲拉,拉2...");// 刚下拉时,显示的提示
endLabels.setRefreshingLabel("好嘞,正在刷新2...");// 刷新时
endLabels.setReleaseLabel("你敢放,我就敢刷新2...");// 下来达到一定距离时,显示的提示
}
mPullRefreshListView.getLoadingLayoutProxy(true, false);接收两个参数,为true,false返回设置下拉的ILoadingLayout;为false,true返回设置上拉的。
3、常用的一些属性
当然了,pull-to-refresh在xml中还能定义一些属性:
ptrMode,ptrDrawable,ptrAnimationStyle这三个上面已经介绍过。
ptrRefreshableViewBackground 设置整个mPullRefreshListView的背景色
ptrHeaderBackground 设置下拉Header或者上拉Footer的背景色
ptrHeaderTextColor 用于设置Header与Footer中文本的颜色
ptrHeaderSubTextColor 用于设置Header与Footer中上次刷新时间的颜色
ptrShowIndicator如果为true会在mPullRefreshListView中出现icon,右上角和右下角,挺有意思的。
ptrHeaderTextAppearance , ptrSubHeaderTextAppearance分别设置拉Header或者上拉Footer中字体的类型颜色等等。
ptrRotateDrawableWhilePulling当动画设置为rotate时,下拉是是否旋转。
ptrScrollingWhileRefreshingEnabled刷新的时候,是否允许ListView或GridView滚动。觉得为true比较好。
ptrListViewExtrasEnabled 决定了Header,Footer以何种方式加入mPullRefreshListView,true为headView方式加入,就是滚动时刷新头部会一起滚动。
最后2个其实对于用户体验还是挺重要的,如果设置的时候考虑下~。其他的属性自己选择就好。
注:上述属性很多都可以代码控制,如果有需要可以直接mPullRefreshListView.set属性名 查看
以上为pull-to-refresh所有支持的属性~~