参考了http://blog.youkuaiyun.com/cjjky/article/details/6898871
但是感觉楼主的代码比较繁琐 所以自己简化
package com.su.testmyloadmorelist;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private View loadMoreView;
private Button loadMoreButton;
private Handler handler = new Handler();
private PaginationAdapter adapter;
private int datasize;
private ListView listView;
int page = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);
loadMoreButton = (Button) loadMoreView
.findViewById(R.id.loadMoreButton);
listView = (ListView) findViewById(R.id.lvNews);
listView.addFooterView(loadMoreView);
loadData(page);
loadMoreButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadMoreButton.setText("正在加载中..."); // 设置按钮文字
handler.postDelayed(new Runnable() {
public void run() {
loadData(page);
loadMoreButton.setText("查看更多..."); // 恢复按钮文字
}
}, 100);
}
});
}
/**
* 加载数据并显示到listview的逻辑
*
* 如果希望点击更多立即显示下文 然后后台加载后面的数据的逻辑
* 需要把news做成一个全局变量上来先让listview加载已经下载好了的在内存的数据
* 然后异步执行从网络加载数据的逻辑 赋给那个全局的news 等待下次的加载.
*/
private void loadData(int i) {
List<News> news = new ArrayList<News>();
int count = (i + 1) * 10;// 为什么计算count请看下面
// 下面的代码将来通过服务器获得
for (i = count - 9; i <= count; i++) {
News items = new News();
items.setTitle("Title" + i);
items.setContent("This is News Content" + i);
news.add(items);
}
if (page == 0) {
adapter = new PaginationAdapter(news, this);
listView.setAdapter(adapter);
} else {
adapter.addNewsItems(news);
adapter.notifyDataSetChanged();
}
// 这里只是假设23是服务器返回的数据总数 如果计算的count大于23了 那么就不用显示加载更多按钮了.
if (count > 23) {
listView.removeFooterView(loadMoreView);
}
page++;
}
class PaginationAdapter extends BaseAdapter {
List<News> newsItems;
Context context;
public PaginationAdapter(List<News> newsitems, Context context) {
this.newsItems = newsitems;
this.context = context;
}
@Override
public int getCount() {
return newsItems.size();
}
@Override
public Object getItem(int position) {
return newsItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
if (view == null) {
view = ((Activity) context).getLayoutInflater().inflate(
R.layout.list_item, null);
}
// 新闻标题
TextView tvTitle = (TextView) view.findViewById(R.id.newstitle);
tvTitle.setText(newsItems.get(position).getTitle());
// 新闻内容
TextView tvContent = (TextView) view.findViewById(R.id.newscontent);
tvContent.setText(newsItems.get(position).getContent());
return view;
}
/**
* 添加数据列表项 调用notifychanged就可以刷新listview了
*
* @param newsitem
*/
public void addNewsItem(News newsitem) {
newsItems.add(newsitem);
}
/**
* 添加数据列表 调用notifychanged就可以刷新listview了
*
* @param newsitem
*/
public void addNewsItems(List<News> newsitems) {
newsItems.addAll(newsitems);
Log.e("test", newsItems.size() + "");
}
}
}
http://dl.vmall.com/c0xbsbgsy6