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
- Android动态加载ListView的实现以及注意事项
- android 实现listview动态加载
- android 实现listview动态加载列表项
- android 实现listview动态加载列表项
- android 实现listview动态加载列表项
- android 实现listview动态加载列表项
- android 实现listview动态加载列表项
- 关于多线程下动态加载ListView数据源的注意事项
- ListView实现动态加载
- android 动态加载Listview
- android ListView 动态加载
- android listview 动态加载数据的问题
- Android ListView 的动态加载数据
- Android的ListView动态加载数据
- android 实现listview动态加载列表项www.maiziedu.com
- android listView动态加载数据
- Android Listview动态加载数据
- Android Listview动态加载数据
- 数据结构-顺序表
- 寒假杭电acm 1
- 关于的python+web开发的调试工具
- 数据结构-链表
- The following classes could not be found: - android.support.v7.internal.widget.ActionBarOverlayLayou
- Android动态加载ListView的实现以及注意事项
- 原型模式,不只是clone那么简单
- Object-c之不可变字符串 常用方法
- tcp/ip经服务器计算字节长度
- 项目难题之ARM串口和台达伺服电机驱动器串口莫名其妙无法通信的问题
- K2工作流学习系列(五)--- K2实战
- Oracle、SQL server、MySQL数据库中分页查询的SQL语句
- 继承HorizontalScrollView的QQ5.0侧滑菜单(一)
- 从一道算法题说去1