做安卓开发的都知道,Android中的ListView的使用率是非常高的。像我经常要用到ListView,并且经常会遇到要动态加载Item的需求,比如说,我的情况是这样的,我现在要从后台拉出用户的列表来显示,然后需要显示的数据有1000条,那我不可能一下子就把1000条数据拉下来都显示吧,首先是这样子耗流量,其次是没必要,有时候用户只看前几条就不看了,重要的是,你一下子显示1000条数据可能会导致UI很卡,用户体验差。所以正常的做法是,规定每一次拉多少条数据,如果用户将ListView拉到了底部,再向后台请求数据,再加载上去;
我下面这个例子是不能运行的,因为这里没有引进List<>所存放的类,也没有从后台拉取数据的代码。不过我讲一下关键点就是,设置ListView的setOnScrollListener,判断是否需要从后台拉取数据,是的话,将从后台拉取的数据用一个TempList来存放,然后再将TempList的数据添加到List去,更新Adapter,清楚TempList里面的数据;
package com.example.helloworld;
import java.util.ArrayList;
import com.supersenior.logic.LogicHandler;
import com.supersenior.logic.params.MySubscriptionsParam;
import com.supersenior.logic.results.MySubscriptionsResult;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class TestActivity extends Activity {
public static final int REFRESH_ADAPTER = 1;
public static final int NO_DATA = 0;
//这里需要注意的是,我这里用了两个List,subscriptionsTemp是用来 做缓存的,如果你不做这个操作,每一次从后台请求数据后就直接放到subs criptions这个List里面去,那么有可能就会出现这样一种情况:你adapa ter.notifyDataSetChanged();
//的同时,又从后台拉去数据放到了subscriptions这个list里面去,这 样就会出错。
private ArrayList<Subscription> subscriptions;
private ArrayList<Subscription> subscriptionsTemp;
private boolean isEnd = false;
private ListView listView;
private Context context;
private MyBaseAdapter adapter;
Handler handler;
private int page = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c_my_setting_ding_yue);
context = this;
initUI();
}
/**
* @author mingwei
*/
// 从后台获得数据
private void getSubscriptions() {
if (result.isOk == true) {
subscriptionsTemp.addAll(result.subscriptionList);
handler.sendEmptyMessage(REFRESH_ADAPTER);
} else {
handler.sendEmptyMessage(NO_DATA);
}
}
private void initUI() {
subscriptions = new ArrayList<Subscription>();
subscriptionsTemp = new ArrayList<Subscription>();
adapter = new MyBaseAdapter(context);
listView = (ListView) findViewById(R.id.lv_ding_yue);
listView.setAdapter(adapter);
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//这一句判断ListView是否到底了
if (firstVisibleItem + visibleItemCount == totalItemCount
&& totalItemCount != 0 && isEnd == false) {
page++;
getSubscriptions();
}
}
});
handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == REFRESH_ADAPTER) {
subscriptions.addAll(subscriptionsTemp);
adapter.notifyDataSetChanged();
subscriptionsTemp.clear();
} else if (msg.what == NO_DATA)
isEnd = true;
}
};
getSubscriptions();
}
class ViewHolder {
ImageView ivHead;
TextView tvMess;
TextView tvPublisher;
TextView tvPublishData;
TextView tvPublishTime;
ImageView imIsV;
}
class MyBaseAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public MyBaseAdapter(Context context) {
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return subscriptions.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int itemId) {
// TODO Auto-generated method stub
return subscriptions.get(itemId).userId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
Subscription subscription;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater
.inflate(R.layout.item_my_ding_yue, null);
holder.imIsV = (ImageView) convertView
.findViewById(R.id.iv_ding_yue_v);
holder.ivHead = (ImageView) convertView
.findViewById(R.id.iv_ding_yue_head);
holder.tvMess = (TextView) convertView
.findViewById(R.id.tv_ding_yue_mes);
holder.tvPublishData = (TextView) convertView
.findViewById(R.id.tv_ding_yue_publish_content);
holder.tvPublisher = (TextView) convertView
.findViewById(R.id.tv_ding_yue_username);
holder.tvPublishTime = (TextView) convertView
.findViewById(R.id.tv_ding_yue_publish_time);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (subscriptions.size() > 0) {
subscription = subscriptions.get(position);
if (subscription.isVUser == true) {
holder.imIsV.setBackgroundResource(R.drawable.attestation);
holder.imIsV.setVisibility(View.VISIBLE);
} else
holder.imIsV.setVisibility(View.INVISIBLE);
holder.ivHead.setBackgroundResource(R.drawable.head);
if (subscription.newsNum == 0)
holder.tvMess.setVisibility(View.INVISIBLE);
else {
holder.tvMess.setText("" + subscription.newsNum);
holder.tvMess.setVisibility(View.VISIBLE);
}
holder.tvPublishTime.setText(subscription.lastUpdateTime);
holder.tvPublisher.setText(subscription.userName);
holder.tvPublishData.setText(subscription.fileInfo);
}
return convertView;
}
}
}