package com.wzt;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.wzt.util.AsyncImageLoader;
import com.wzt.util.AsyncImageLoader.ImageCallback;
import com.wzt.util.HttpUtil;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
public class UserActivity extends ListActivity implements OnScrollListener {
private ListView listView;
private HomeAdapter adapter;
private JSONArray array;
private AsyncImageLoader asyncImageLoader;
private Handler handler;
private ProgressDialog progressDialog;
private LinearLayout list_footer;
private LinearLayout loading;
private List<JSONObject> list;// 微博数据列表
private ExecutorService executorService;
private int TOTAL_PAGE = 0;// 当前已经记在的微博页数
private static int THREADPOOL_SIZE = 4;// 线程池的大小
private int visibleLastIndex = 0; // 最后的可视项索引
private int visibleItemCount; // 当前窗口可见项总数
public static int SCROLL_STATE_IDLE = 2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user);
setUpViews();
progressDialog = new ProgressDialog(UserActivity.this);// 生成一个进度条
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("请稍等");
progressDialog.setMessage("正在读取数据中!");
handler = new GetHomeTimeLineHandler();
executorService.submit(new GetHomeTimeLineThread());// 耗时操作,开启一个新线程获取数据
progressDialog.show();
}
private void setUpViews() {
list_footer = (LinearLayout) LayoutInflater.from(UserActivity.this)
.inflate(R.layout.list_footer, null);
loading = (LinearLayout) list_footer.findViewById(R.id.loading);
listView = getListView();
listView.addFooterView(list_footer);// 这儿是关键中的关键呀,利用FooterVIew分页动态加载
list = new ArrayList<JSONObject>();
executorService = Executors.newFixedThreadPool(THREADPOOL_SIZE);
// 实现监听器
listView.setOnScrollListener(this); //添加滑动监听
//loading.setVisibility(View.VISIBLE);// 隐藏下方的进度条
}
class GetHomeTimeLineHandler extends Handler {
@Override
public void handleMessage(Message msg) {
adapter = new HomeAdapter(UserActivity.this, list);
if (TOTAL_PAGE > 1) {
listView.setVisibility(View.GONE);
adapter.notifyDataSetChanged();
listView.setVisibility(View.VISIBLE);
}
if (TOTAL_PAGE == 1) {
listView.setAdapter(adapter);
}
//listView.setSelection(visibleLastIndex - visibleItemCount + 1); //设置选中项
progressDialog.dismiss();// 关闭进度条
loading.setVisibility(View.GONE);// 隐藏下方的进度条
}
}
class GetHomeTimeLineThread implements Runnable {
@Override
public void run() {
try {
Thread.sleep(2000);
refreshList();
Message msg = handler.obtainMessage();// 通知线程来处理范围的数据
msg.sendToTarget();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void refreshList() {
String url = HttpUtil.BASE_URL + "android/user/user_json_3.php?page="
+ TOTAL_PAGE + "&r=" + Math.random();
String jsonStr = HttpUtil.queryStringForPost(url);
try {
JSONObject dataObj = new JSONObject(jsonStr).getJSONObject("posts");
array = dataObj.getJSONArray("info");
if (array != null && array.length() > 0) {
TOTAL_PAGE++;
for (int i = 0; i < array.length(); i++) {
list.add(array.optJSONObject(i));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.visibleItemCount = visibleItemCount;
visibleLastIndex = firstVisibleItem + visibleItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
int lastIndex = adapter.getCount() + 1;
Log.e("AdapterNumber:", lastIndex+"");
Log.e("visibleLastIndex:", visibleLastIndex+"");
Log.e("scrollState:", scrollState+"");
loading.setVisibility(View.VISIBLE);
if (visibleLastIndex == lastIndex && scrollState == SCROLL_STATE_IDLE) {
executorService.submit(new GetHomeTimeLineThread());
}
}
class HomeAdapter extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private List<JSONObject> list;
public HomeAdapter(Context context, List<JSONObject> list) {
super();
this.context = context;
this.list = list;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
asyncImageLoader = new AsyncImageLoader();
HomeViewHolder viewHolder = new HomeViewHolder();
JSONObject data = (JSONObject) list.get(position);
if(convertView == null){
convertView = inflater.inflate(R.layout.item_user, null);
}
viewHolder.avatar = (ImageView) convertView
.findViewById(R.id.picture);
viewHolder.username = (TextView) convertView
.findViewById(R.id.username);
viewHolder.email = (TextView) convertView.findViewById(R.id.email);
if (data != null) {
try {
viewHolder.username.setText(data.getString("news_title"));
viewHolder.email.setText(data.getString("news_content"));
// 异步加载图片
Drawable cachedImage = asyncImageLoader.loadDrawable(
data.getString("avatar"), viewHolder.avatar,
new ImageCallback() {
@Override
public void imageLoaded(Drawable imageDrawable,
ImageView imageView, String imageUrl) {
imageView.setImageDrawable(imageDrawable);
}
});
if (cachedImage == null) {
viewHolder.avatar.setImageResource(R.drawable.icon);
} else {
viewHolder.avatar.setImageDrawable(cachedImage);
}
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
return convertView;
}
}
static class HomeViewHolder {
private ImageView avatar;
private TextView username;
private TextView email;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
android listview ProgressBar listview底部实现加载分页的效果
共43个文件
class:21个
java:7个
xml:6个
4星 · 超过85%的资源 需积分: 9 107 下载量 166 浏览量
2012-07-14
11:42:08
上传
评论 3
收藏 42KB RAR 举报
温馨提示
这个demo是有listview实现的,里面又ProgressBar提示正在加载的效果,还有listview显示列表数据,当道最地下面的时候,向上滑动页面,会有加载更多的功能及效果,实现分页的另一种效果
资源推荐
资源详情
资源评论
收起资源包目录
PHP_Client_5.rar (43个子文件)
PHP_Client_5
.project 848B
project.properties 377B
proguard.cfg 1KB
src
com
wzt
MainActivity.java 727B
UserActivity.java 7KB
util
AsyncImageLoader.java 2KB
ImageUtil.java 6KB
HttpUtil.java 4KB
AndroidManifest.xml 1KB
res
drawable-ldpi
icon.png 871B
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 3KB
layout
user.xml 598B
item_user.xml 1KB
list_footer.xml 945B
main.xml 564B
values
strings.xml 233B
assets
gen
com
wzt
BuildConfig.java 149B
R.java 1KB
.classpath 364B
bin
classes
com
wzt
R$layout.class 457B
UserActivity$HomeAdapter$1.class 1KB
BuildConfig.class 323B
R$drawable.class 402B
R$attr.class 307B
UserActivity$HomeViewHolder.class 1KB
UserActivity$GetHomeTimeLineThread.class 1KB
UserActivity.class 6KB
util
ImageUtil.class 7KB
AsyncImageLoader.class 2KB
AsyncImageLoader$2.class 2KB
HttpUtil.class 4KB
AsyncImageLoader$ImageCallback.class 330B
AsyncImageLoader$1.class 1KB
R$id.class 549B
UserActivity$GetHomeTimeLineHandler.class 2KB
R.class 454B
R$string.class 422B
UserActivity$HomeAdapter.class 4KB
MainActivity$1.class 906B
MainActivity.class 925B
jarlist.cache 119B
res
共 43 条
- 1
陈jack
- 粉丝: 1
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页