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

做安卓开发的都知道,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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值