安卓实现下拉刷新效果
先上效果图:
使用网络应用时,比如QQ、微信这些,我们经常会通过下拉实现消息的刷新。下面记录一种通过调用第三方文件实现下拉刷新ListView的方法
步骤一、先在github中搜索Android-PullToRefresh-master并下载
步骤二、在AndroidStudio中新建一个项目,右键Importt Module导入Android-PullToRefresh-master中的library文件(注意调整好项目的sdk和jdk版本)如何导入类库文件?
步骤三、复制类库文件library中的PullToRefreshListView.java的路径到自己新建的项目中的布局文件中,并给它添加宽高和id,如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.contentprovide.liuliu.demo_3_3_7.MainActivity">
<com.handmark.pulltorefresh.library.PullToRefreshListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_listview"
></com.handmark.pulltorefresh.library.PullToRefreshListView>
</LinearLayout>
步骤四、在java文件中使用集合和适配器给集合添加列表项内容,在异步线程中处理刷新行为,并且在ListView对象中的监听事件中执行异步线程
package com.contentprovide.liuliu.demo_3_3_7;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
PullToRefreshListView my_listview;
//定义一个集合对象用于存放listview的列表项内容
List<String> list;
// 定义一个ListView适配器
ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
my_listview = (PullToRefreshListView) findViewById(R.id.my_listview);
list = new ArrayList<>();
list.add("Item1");
list.add("Item2");
list.add("Item3");
list.add("Item4");
arrayAdapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,list);
// 把适配器添加ListView对象中
my_listview.setAdapter(arrayAdapter);
// 设置事件监听器
my_listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
// 执行异步线程
asyncTask.execute();
}
});
}
// 在异步线程中处理刷新行为
AsyncTask<Void,Void,Void> asyncTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
// 手动休眠三秒,模仿从服务器端获取信息的延迟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
list.add("新增加的Item1");
list.add("新增加的Item2");
// 通知ListView对象刷新完成
my_listview.onRefreshComplete();
}
};
}
今天看到之前写的这篇博客突然发现了一个问题,我上面写的这个刷新程序当我连续下拉刷新了两次之后程序就会崩溃强制弹出,后来重新看了一遍代码发现是线程执行那里的问题。AsyncTask的对象是只能执行一次的 ,如果我需要执行同一个线程对象多次可以使用匿名对象,每一次都用一个新的对象去执行。下面是我更新后的步骤四的代码,其他步骤没有问题:
package com.contentprovide.liuliu.demo_3_3_7; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { PullToRefreshListView my_listview; //定义一个集合对象用于存放listview的列表项内容 List<String> list; // 定义一个ListView适配器 ArrayAdapter<String> arrayAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); my_listview = (PullToRefreshListView) findViewById(R.id.my_listview); list = new ArrayList<>(); list.add("Item1"); list.add("Item2"); list.add("Item3"); list.add("Item4"); arrayAdapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,list); // 把适配器添加ListView对象中 my_listview.setAdapter(arrayAdapter); // 设置事件监听器 my_listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() { @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { // 执行异步线程
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
// 手动休眠三秒,模仿从服务器端获取信息的延迟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
list.add("新增加的Item1");
list.add("新增加的Item2");
// 通知ListView对象刷新完成
my_listview.onRefreshComplete();
}
};
.execute(); } });
}