在与后台服务相关的项目中从后台获取数据经常会用到拉下刷新上拉添加数据,一般后台的数据是分页的,比如我们刚进入应用程序中获取的后台的第一页数据,当我们把第一页的数据浏览完了,这时候我们就可以往上拉获得第二页的数据。如果后台新添加了数据时,我们想要浏览,就下拉刷新重新获取第一页的数据。如果我们用的是List表来存储数据不对List表做处理,就会导致有很多重复的数据在列表中。这时我们就会想到下拉刷新时把List表的数据清空,这样就不会有重复的数据了啊,好像达到了我们的目的了。但是又有问题出现了,原本List表里的第二页数据也会随之清掉,想看第二页数据又要从新从后台获取,非常浪费流量。那这样才能解决下拉刷新获得的新数据显示在列表的最上面呢?代码如下:
public class MonthlyBillsActivity extends MyBaseActivity{
protected static final int MONTHLYBILLSTGEXQDATA = 2;
private int MONTHLYBILLSGETNUMBER = 1;
//自定义下拉刷新上拉添加
private PullToRefreshListView listView;
//存储数据
private List<MonthlyBillsInfo>monthlyBillsInfos = new ArrayList<MonthlyBillsInfo>();
//适配器
private MonthlyAdapter adapter;
//后台获取数据的条数
private final int ROWS = 10;
//后台数据的页数
private final int FIRSTPAGE = 1;
private int page = FIRSTPAGE;
//判断是否下拉
private int refreshnum=0;
private boolean isRefresh = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "创建");
setContentView(R.layout.monthly_bills_activity);
//加载数据
initData();
//初始化控件
initView();
//事件监控
initEvent();
}
private void initData() {
//向后台发请求获取数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("proprietor_id", UserInfoUtils.getUserCode());
map.put("page", String.valueOf(page));
map.put("rows", String.valueOf(ROWS));
String url = getResources().getString(R.string.http_url_getBillList);
doRequest(MONTHLYBILLSGETNUMBER, url, map , true);
}
//解析后台数据
@Override
protected void onExecuteMapSuccess(int requestId, Map responseData) {
super.onExecuteMapSuccess(requestId, responseData);
Log.v("JJF", "进入");
String name = "";
String title = "";
String time = "";
String id = "";
if (requestId == MONTHLYBILLSGETNUMBER) {
Log.v("JJF", "" + responseData);
Map page = (Map) responseData.get("page");
List<Map> rows = (List<Map>) page.get("rows");
for (int i = 0; i < rows.size(); i++) {
Map map = rows.get(i);
if (map.get("id") != null) {
id = map.get("id").toString();
}
if (map.get("person") != null) {
name = map.get("person").toString();
}
if (map.get("title") != null) {
title = map.get("title").toString();
}
if (map.get("bill_date") != null) {
time = map.get("bill_date").toString();
}
MonthlyBillsInfo billsInfo = new MonthlyBillsInfo();
billsInfo.setName(name);
billsInfo.setTitle(title);
billsInfo.setTime(time);
billsInfo.setId(id);
//判断是否是下拉刷新
if (isRefresh) {
//判断是否是重复的数据
if(!monthlyBillsInfos.contains(billsInfo)){
//把新的数据添加到List表的最前面
monthlyBillsInfos.add(refreshnum,billsInfo);
refreshnum++;
}
}
//判断是否是重复的数据
if(!monthlyBillsInfos.contains(billsInfo))
monthlyBillsInfos.add(billsInfo);
}
//通知适配器改变
adapter.notifyDataSetChanged();
listView.onRefreshComplete();
}
}
private void initView() {
listView = (PullToRefreshListView) findViewById(R.id.monthly_bills_listView);
listView.setScrollingWhileRefreshingEnabled(false);
adapter = new MonthlyAdapter(this, monthlyBillsInfos);
listView.setAdapter(adapter);
}
private void initEvent() {
//监听上拉刷新下拉添加
listView.setOnRefreshListener(new OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(//刷新通过异步加载数据
PullToRefreshBase<ListView> refreshView) {
new AddDataTask().execute();
}
@Override
public void onPullUpToRefresh(//添加通过异步加载数据
PullToRefreshBase<ListView> refreshView) {
new AppendDataTask().execute();
}
});
//listView每项的点击事件
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
}
});
ListView EaListView = listView.getRefreshableView();
registerForContextMenu(EaListView);
}
private class AddDataTask extends AsyncTask<Void, Void, String[]> {
@Override
protected String[] doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(String[] result) {//刷新
isRefresh = true;
refreshnum=0;
page = FIRSTPAGE;
Map<String, Object> map = new HashMap<String, Object>();
map.put("proprietor_id", UserInfoUtils.getUserCode());
map.put("page", String.valueOf(page));
map.put("rows", String.valueOf(ROWS));
String url = getResources().getString(R.string.http_url_getBillList);
doRequest(MONTHLYBILLSGETNUMBER, url, map , false);
super.onPostExecute(result);
}
}
private class AppendDataTask extends AsyncTask<Void, Void, String[]> {
@Override
protected String[] doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(String[] result) {//加载
page ++;
Map<String, Object> map = new HashMap<String, Object>();
map.put("proprietor_id", UserInfoUtils.getUserCode());
map.put("page", String.valueOf(page));
map.put("rows", String.valueOf(ROWS));
String url = getResources().getString(R.string.http_url_getBillList);
doRequest(MONTHLYBILLSGETNUMBER, url, map , false);
super.onPostExecute(result);
}
}
}
首先我们定义个Boolean类型的变来判断是否是刷新,如果是刷新就执行刷新里面的语句通过(!monthlyBillsInfos.contains(billsInfo))来判断是否有相同的数据然后在把新的数据添加到List表的最前面通过monthlyBillsInfos.add(refreshnum,billsInfo)来实现。如果新增的数据又多条,刷新的时候是把后台第一页的第一条数据先获取再获取第二条,所以这里用了个refreshnum变量来控制,让先获取得放在List表的最前面,第二获取得放在List表的第二个位置,这样就完成了最新的数据显示在ListView的最上面。怎样判断是否相同,通过后台获取数据的ID来判断是否相同。这里要在存储数据的类加以个方法,代码如下:
public class MonthlyBillsInfo {
@Override
public boolean equals(Object o) {
if(this.id.equals(((MonthlyBillsInfo)o).id)){
return true;
}else{
return false;
}
}
@Override
public int hashCode() {
return id.hashCode();
}
private String title;
private String name;
private String time;
private String id;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
这样就解决了是否相同数据了。