最近公司项目中要用到上拉加载更多,下拉刷新功能。githup中提供现成的Xlistview,只是xlistview中在没有加载满数据的时候,上拉加载的时候会出现一些小问题,不能及时加载会卡住,这个需要在xlistview中将if (getLastVisiblePosition() == mTotalItemCount - 1) (304行左右)中的if 前面是else去掉,这样就可以用了 修改好的 xlistview下载地址http://download.csdn.net/detail/u012303938/8447547,有了xlistview我们就开始往项目中镶入吧。
首先将XListView,XListViewFooter,XListViewHeader拷贝到类中,将list_item,xlistview_footer,xlistview_header放进laydout中,将values中的strings内的内容相应的考呗进项目中,将drawable中的xlistview_arrow相应的考呗到项目中,接下来就是修改最重要的MainActivity了。
要用到xlistview所以你的activity_main中的listview必须用类名下的xlistview 示例如下:
<span style="font-size:14px;"><com.tyb.tools.XListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000" >
</com.tyb.tools.XListView></span>
在MainActivity 中去实现IXListViewListener有两个方法onLoadMore()上拉加载更多,onRefresh()下拉刷新,
cleanData();
pross.setVisibility(View.VISIBLE);
loadData();
listview.setPullLoadEnable(true);
cleanData();用来清除数据,pross.setVisibility(View.VISIBLE);进入列表页面进步条可见,loadData();访问网络获取数据,listview.setPullLoadEnable(true);设置listview可滑动。我先把自己项目中的一个上拉加载更多和下拉刷新的activity放上来讲解。
package com.tyb.custom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import com.tyb.R;
import com.tyb.tools.BaseActivity;
import com.tyb.tools.GetPost;
import com.tyb.tools.GlobalConts;
import com.tyb.tools.RequestParams;
import com.tyb.tools.XListView;
import com.tyb.tools.XListView.IXListViewListener;
public class CustomActivity extends BaseActivity implements IXListViewListener{
private final String PREFERENCES_NAME = GlobalConts.SHAREPREFRENCE_NAME;
private String uid="",cid="",pwd="";
private customdata customdata;
private XListView listview;
private ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();;
private ImageView btn_back,btn_up;
private String name="";
private RelativeLayout data;
private TextView tv_nodata;
private Handler mHandler;
private int page=1;
private MyAdapter adapter;
private ProgressBar pross;
private Context context;
private View view;
private EditText et_name,et_phoe;
private boolean ifloadsearch=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState,R.layout.custom_main);
SharedPreferences preferences = getSharedPreferences(
PREFERENCES_NAME, Activity.MODE_PRIVATE);
cid=preferences.getString("cid", "");
uid=preferences.getString("uid", "");
pwd=preferences.getString("pwd", "");
if(GlobalConts.isNetworkAvailable(this)){
data.setVisibility(View.GONE);
}else{
data.setVisibility(View.VISIBLE);
tv_nodata.setText("请确认连接网络!");
return ;
}
cleanData();
pross.setVisibility(View.VISIBLE);
loadData();
listview.setPullLoadEnable(true);
}
private void cleanData() {
// TODO Auto-generated method stub
ifloadsearch=false;
list.clear();
customdata=new customdata();
customdata.setLinkman("");
customdata.setMob("");
customdata.setPageall("1");
customdata.setCurrentpage("1");
page=1;
}
private void loadData() {
// TODO Auto-generated method stub
/*
* http://192.168.0.253:8023/port/custom.aspx?
* cid=001&user=super&pwd=123&action=list
* &pagenum=&cno=&cname=&linkman=&mob=&
* point=&address=&vtime=2015-02-11&content=
* &nexttime=2015-02-12&nextcontent=&attention=&vstime=
* 2015-02-11&vetime=2015-02-11
*/
RequestParams params=new RequestParams();
params.put("cid", cid);
params.put("user", uid);
params.put("pwd", pwd);
params.put("pagenum", customdata.getCurrentpage());
params.put("linkman", customdata.getLinkman());
params.put("mob", customdata.getMob());
params.put("action", "list");
new GetLodeTask().execute(params.toString());
}
class GetLodeTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
GetPost getPost=new GetPost();
try {
return getPost.urlPost(arg0[0], getPost.URL_CUSTOM);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "4";
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
try {
if(result.equals("4"))
{
pross.setVisibility(View.GONE);
Toast.makeText(CustomActivity.this, R.string.conn, 1).show();
}
else{
pross.setVisibility(View.GONE);
BindAdapter(result);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void findViews() {
// TODO Auto-generated method stub
context=this;
btn_up=(ImageView)findViewById(R.id.btn_up);
pross=(ProgressBar) findViewById(R.id.pross);
tv_nodata=(TextView) findViewById(R.id.tv_nodata);
data=(RelativeLayout) findViewById(R.id.data);
listview=(XListView) findViewById(R.id.listview);
btn_back=(ImageView) findViewById(R.id.btn_back);
}
@Override
public void addListeners() {
// TODO Auto-generated method stub
btn_up.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
view=View.inflate(context, R.layout.custom_search, null);
et_name=(EditText) view.findViewById(R.id.linkman);
et_phoe=(EditText) view.findViewById(R.id.mob);
new AlertDialog.Builder(context).setTitle("客户列表查询")
.setView(view).setNegativeButton("取消", null).setPositiveButton("确定", new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
String mob=et_phoe.getText().toString();
String linkman=et_name.getText().toString();
customdata.setLinkman(linkman);
customdata.setMob(mob);
list.clear();
loadData();
ifloadsearch=true;
}
}).create().show();
}
});
btn_back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
finish();
}
});
}
protected void BindAdapter(String result) throws JSONException {
// TODO Auto-generated method stub
JSONObject jsonObject = new JSONObject(result.toString());
if ("success".equals(jsonObject.getString("flag"))) {
onLoad();
data.setVisibility(View.GONE);
name=jsonObject.getString("ename");
JSONArray array = jsonObject.getJSONArray("Custom");
customdata.setPageall(jsonObject.getString("pageall"));
int l = array.length();
for (int i = 0; i < l; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", array.getJSONObject(i).getString("id"));
map.put("CustomNo", array.getJSONObject(i).getString("CustomNo"));
map.put("Address", array.getJSONObject(i).getString("Address"));
map.put("Custom", array.getJSONObject(i)
.getString("Custom"));
map.put("LinkMan", array.getJSONObject(i)
.getString("LinkMan"));
map.put("Mobile", array.getJSONObject(i).getString("Mobile"));
map.put("CustomGrade", array.getJSONObject(i)
.getString("CustomGrade"));
list.add(map);
}
adapter = new MyAdapter(this, list);
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
listview.setXListViewListener(this);
mHandler = new Handler();
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
Log.i("values", "pos:"+arg2);
Intent intent=new Intent(CustomActivity.this,CustomDetail.class);
int pos=arg2-1;
Log.i("values", list.get(pos).get("CustomNo").toString());
intent.putExtra("CustomNo", list.get(pos).get("CustomNo").toString());
startActivity(intent);
}
});
} else {
listview.setAdapter(null);
tv_nodata.setText("暂无数据");
data.setVisibility(View.VISIBLE);
}
}
private class MyAdapter extends BaseAdapter{
private Context context;
private List<Map<String, Object>> list;
public MyAdapter(Context context,List<Map<String, Object>> list){
this.context=context;
if(list==null){
list=new ArrayList<Map<String,Object>>();
}else{
this.list=list;
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if (list != null)
return list.size();
else
return 0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
if (list != null)
return list.get(position);
else
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convervierw, ViewGroup arg2) {
// TODO Auto-generated method stub
ViewHolder holder=new ViewHolder();
if(convervierw==null){
convervierw=View.inflate(context, R.layout.customactivity_item, null);
holder.CustomNo=(TextView) convervierw.findViewById(R.id.CustomNo);
holder.Custom=(TextView) convervierw.findViewById(R.id.Custom);
holder.LinkMan=(TextView) convervierw.findViewById(R.id.LinkMan);
holder.Mobile=(TextView) convervierw.findViewById(R.id.Mobile);
holder.CustomGrade=(TextView) convervierw.findViewById(R.id.CustomGrade);
holder.btn_ct=(Button) convervierw.findViewById(R.id.btn_ct);
convervierw.setTag(holder);
}else{
holder=(ViewHolder) convervierw.getTag();
}
holder.CustomNo.setText((String)list.get(position).get("CustomNo"));
holder.Custom.setText((String)list.get(position).get("Custom"));
holder.LinkMan.setText((String)list.get(position).get("LinkMan"));
holder.Mobile.setText((String)list.get(position).get("Mobile"));
holder.CustomGrade.setText((String)list.get(position).get("CustomGrade"));
holder.btn_ct.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent(CustomActivity.this,CustomAdd.class);
intent.putExtra("CustomNo", (String)list.get(position).get("CustomNo"));
intent.putExtra("Custom", (String)list.get(position).get("Custom"));
intent.putExtra("name", name);
startActivity(intent);
}
});
return convervierw;
}
public final class ViewHolder {
public TextView CustomNo;
public TextView Custom;
public TextView LinkMan;
public TextView Mobile;
public TextView CustomGrade;
public Button btn_ct;
}
}
@Override
public void onRefresh() {
// TODO Auto-generated method stub
cleanData();
loadData();
}
@Override
public void onLoadMore() {
// TODO Auto-generated method stub
if(ifloadsearch){
Toast.makeText(CustomActivity.this,"没有新数据了!", 1).show();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
onLoad();
}
}, 500);
return;
}
//customdata.setCurrentpage(String.valueOf(page));
if(customdata.getCurrentpage().equals(customdata.getPageall())){
Toast.makeText(CustomActivity.this,"没有新数据了!", 1).show();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
onLoad();
}
}, 500);
return;
}else{
page=page+1;
customdata.setCurrentpage(String.valueOf(page));
loadData();
adapter.notifyDataSetChanged();
}
}
private void onLoad() {
listview.stopRefresh();
listview.stopLoadMore();
listview.setRefreshTime("刚刚");
}
}
好了 咱们接着写,在onRefresh()中写入cleanData()清除数据;loadData()重新加载网路数据;在loadData中获取后的数据如下
JSONObject jsonObject = new JSONObject(result.toString());
if ("success".equals(jsonObject.getString("flag"))) {
onLoad();
获取数据成果后加入onLoad();方法 这个方法是将下拉刷新的进度条隐藏,同时加上这句pross.setVisibility(View.GONE);进入页面的进步条也隐藏掉,因为获取数据成果就要把进度条都隐藏。loadata()获取数据成果后 代码如下
adapter = new MyAdapter(this, list);
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
listview.setXListViewListener(this);
往listview中加入数据。这样 我们就实现下拉刷新获取数据了,接下来将上拉加载更多onLoadMore()方法。代码如下
if(customdata.getCurrentpage().equals(customdata.getPageall())){
Toast.makeText(CustomActivity.this,"没有新数据了!", 1).show();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
onLoad();
}
}, 500);
return;
}else{
page=page+1;
customdata.setCurrentpage(String.valueOf(page));
loadData();
adapter.notifyDataSetChanged();
}
customdata.getCurrentpage().equals(customdata.getPageall())是判断是不是访问数据最后一页的数据,如果是的话onLoad();返回不执行给个提示Toast.makeText(CustomActivity.this,"没有新数据了!", 1).show();就可以了。如果有下一页我们page=page+1;customdata.setCurrentpage(String.valueOf(page));设置当前的页数,loadData(); 重新获取第二页的数据,在 loadData()中params.put("pagenum", customdata.getCurrentpage());拼接的&pagenum=?,如何拼接参数看我的这篇文章http://blog.csdn.net/u012303938/article/details/42709015 。 adapter.notifyDataSetChanged();更新下adapter,最后就是查询数据了,ifloadsearch判断是否是search的状态下的 向上拉下载更多,如果是的话onLoad();返回,不许往list中加入数据。list是private ArrayList<Map<String, Object>> list = new ArrayList<Map<String, Object>>();用来存放加载出来的数据,必须是全局中进行初始化。
在btn_up是用来查询数据的,如下
String mob=et_phoe.getText().toString();
String linkman=et_name.getText().toString();
customdata.setLinkman(linkman);
customdata.setMob(mob);
list.clear();
loadData();
ifloadsearch=true;
customdata.setLinkman(linkman); customdata.setMob(mob);存放数据, list.clear();清除list的数据,ifloadsearch=true;是查询的状态,loadData();重新获取数据
params.put("linkman", customdata.getLinkman());params.put("mob", customdata.getMob());拼接的要查询的参数,注意不要忘了cleandata()
ifloadsearch=false;
list.clear();
customdata=new customdata();
customdata.setLinkman("");
customdata.setMob("");
customdata.setPageall("1");
customdata.setCurrentpage("1");
page=1;
结合上面的代码仔细看看就OK了 给大家一个效果图如下
下拉刷新效果图
上拉加载更多效果图
查询效果图