Android动态加载ListView的实现以及注意事项

来源:互联网 发布:传奇登录器python 编辑:程序博客网 时间:2024/06/17 05:40

做安卓开发的都知道,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;        }    }}
0 0
原创粉丝点击