1. 导入PullToRefresh
1.1 修改library的build.gradle中的sdk版本(要与自己的sdk版本一样)
//修改前
compileSdkVersion 16
buildToolsVersion "27.0.3"
defaultConfig {
minSdkVersion 4
targetSdkVersion 4
}
//修改后
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
minSdkVersion 15
targetSdkVersion 27
}
1.2 Clear Project后会报如下错误,修改源代码:“PullToRefreshWebView”
错误: 找不到符号
符号: 方法 floor(float)
位置: 类 FloatMath
FloatMath.floor -> Math.floor
1.3 选中自己的工程,例如:“app”然后鼠标右键“open Moduel settings”导入库
1.4 修改layout布局文件,添加PullToRefresh控件替换ListView即可
2. 第三方控件:上拉加载、下拉刷新控件
2.1 导入第三方插件库
Android-PullToRefresh-master.zip
2.2 在布局文件中使用第三方插件
com.handmark.pulltorefresh.library.PullToRefreshListView
2.3 自定义适配器(BaseAdapter)提供数据
2.4 异步任务查询数据(AsyncTask)
2.4.1 AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String
2.4.2 异步加载数据最少要重写以下这两个方法
doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI
--注:此方法中再通知适配器和控件
myBaseAdapter.notifyDataSetChanged();// 通知适配器数据已改变
plv_main_plv1.onRefreshComplete();// 通知控件数据已经加载完毕
2.5 给PullToRefreshListView设置相关属性
plv_main_1.setMode(Mode.BOTH);// 设置刷新模式
Mode.BOTH:同时支持上拉下拉
Mode.PULL_FROM_START:只支持下拉Pulling Down
Mode.PULL_FROM_END:只支持上拉Pulling Up
plv_main_1.getLoadingLayoutProxy().setPullLabel("上拉刷新...");// 刚下拉时,显示的提
plv_main_1.getLoadingLayoutProxy().setRefreshingLabel("正在载入...");// 刷新时
plv_main_1.getLoadingLayoutProxy().setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示
package com.example.android_09;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private PullToRefreshListView lv_main_show;
private int page=1;
private List<Book> data = new BookDao().list(page);
private MyBaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main_show = findViewById(R.id.lv_main_show);
adapter = new MyBaseAdapter((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE));
lv_main_show.setAdapter(adapter);
// 设置刷新模式
// 只支持上拉Pulling Up
// Mode.BOTH:同时支持上拉下拉
// Mode.PULL_FROM_START:只支持下拉Pulling Down
lv_main_show.setMode(PullToRefreshBase.Mode.PULL_FROM_END);
lv_main_show.getLoadingLayoutProxy().setPullLabel("上拉刷新...");// 刚下拉时,显示的提
lv_main_show.getLoadingLayoutProxy().setRefreshingLabel("正在载入...");// 刷新时
lv_main_show.getLoadingLayoutProxy().setReleaseLabel("放开刷新...");// 下来达到一定距离时,显示的提示
lv_main_show.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
new MyTask().execute();
}
});
}
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
data.addAll(new BookDao().list(++page));
return null;
}
/**
* 回调
* @param o
*/
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
adapter.notifyDataSetChanged();// 通知适配器数据已改变
lv_main_show.onRefreshComplete();// 通知控件数据已经加载完毕
}
}
class MyBaseAdapter extends BaseAdapter{
// 布局解析器
private LayoutInflater inflater;
public MyBaseAdapter(LayoutInflater inflater) {
this.inflater = inflater;
}
/**
* 像资源数量
* @return
*/
@Override
public int getCount() {
return data.size();
}
/**
* 解析像资源的数据
* @param position
* @return
*/
@Override
public Object getItem(int position) {
return data.get(position);
}
/**
* 解析数据的下标
* @param position
* @return
*/
@Override
public long getItemId(int position) {
return position;
}
/**
* 解析试图
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
class ViewHolder{
ImageView iv_listviewitem_image;
TextView tv_listviewitme_title;
TextView tv_listviewitme_author;
TextView tv_listviewitme_price;
TextView tv_listviewitme_publish;
TextView tv_listviewitme_remark;
}
View v=convertView;
if(v==null){
v = inflater.inflate(R.layout.listview_item, null);
Log.i("position",""+position);
ViewHolder holder=new ViewHolder();
holder.iv_listviewitem_image = v.findViewById(R.id.iv_listviewitem_image);
holder.tv_listviewitme_title = v.findViewById(R.id.tv_listviewitme_title);
holder.tv_listviewitme_author = v.findViewById(R.id.tv_listviewitme_author);
holder.tv_listviewitme_price = v.findViewById(R.id.tv_listviewitme_price);
holder.tv_listviewitme_publish = v.findViewById(R.id.tv_listviewitme_publish);
holder.tv_listviewitme_remark = v.findViewById(R.id.tv_listviewitme_remark);
v.setTag(holder);
}
ViewHolder tag = (ViewHolder) v.getTag();
Book book = data.get(position);
tag.iv_listviewitem_image.setImageResource(book.getImage());
tag.tv_listviewitme_title.setText(book.getTitle());
tag.tv_listviewitme_author.setText(book.getAuthor());
tag.tv_listviewitme_price.setText(book.getPrice().toString());
tag.tv_listviewitme_publish.setText(book.getPublish());
tag.tv_listviewitme_remark.setText(book.getRemark());
return v;
}
}
}