listview分页载入问题

方案一:

底部有查看很多其它能够使用HeaderViewListAdapter

假设须要加入数据, 就向Adapter绑定的数据里面加入. 然后调用Adapter.notifyDataSetChanged()方法, ListView会自己主动刷新;

public class

HeaderViewListAdapter

extends Object

implements Filterable WrapperListAdapter

java.lang.Object
   ? android.widget.HeaderViewListAdapter

Class Overview


ListAdapter used when a ListView has header views. This ListAdapter wraps another one and also keeps track of the header views and their associated data objects.

This is intended as a base class; you will probably not need to use this class directly in your own code.

方案二:


简单说一下怎么实现listview分页载入:

1.在listview初始化的时候加个footview,并初始化相关变量以及要设置listview的OnScrollListener:

listview = (ListView) layoutMain.findViewById(R.id.vidoe_list);

layoutFooter = (RelativeLayout) mLayoutInflater.inflate(

R.layout.contact_list_footer, null);

listview.addFooterView(layoutFooter);

adapter = new VideoListAdapter();

listview.setAdapter(adapter);

listview.setOnItemClickListener(mItemClickListener);

listview.setOnScrollListener(mHLOnScrollListener);

2.载入数据:载入数据的时候最好用一个线程来执行载入过程,完了之后就用handler发个消息出来。这里要控制这个线程的

生命周期,假如线程已经启动而且还没跑完,就先不要再启动,等上一次跑完再start一个线程

private Thread threadLoadHLData;

List<VidoeDetailInfoItem> listVideoInfo = new ArrayList<VidoeDetailInfoItem>();// 数据列表

List data ;

private void onLoadData(final String url, final String pageName) {

if (threadLoadHLData == null || !threadLoadHLData.isAlive()) {//检測线程状态

threadLoadHLData = new Thread() {

public void run() {

Looper.prepare();

try {

data = VideoDownloadClient.requestPageData(

VideoListLayoutManager.this.ctx, url,

PageParserFactory.getParser(parserType), pageName);

//sleep(200);

if(null != data){

HLhandler.obtainMessage(1).sendToTarget();

}else{

HLhandler.obtainMessage(2).sendToTarget();

}

} catch (IOException e) {

// TODO Auto-generated catch block

Log.e("IOException", e.getMessage());

HLhandler.obtainMessage(2).sendToTarget();

}

}

};

threadLoadHLData.start();

}

}

3.在OnScrollListener的实现方法中检測是不是已经滑动到最后一个:

OnScrollListener mHLOnScrollListener = new OnScrollListener(){

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

// TODO Auto-generated method stub

if (firstVisibleItem + visibleItemCount == totalItemCount) {//推断是不是最后一个

// 开线程去下载网络数据

if (threadLoadHLData == null || !threadLoadHLData.isAlive()) {

onLoadData(url );//这里的载入数据跟開始初始化时一样的

//if (pageHLIndex < 82) {

pageHLIndex++;

//}

}

}

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

// TODO Auto-generated method stub

}

};

方案三:

Android market里软件列表,每页显示10条记录,没有显示上一页,下一页的button,依靠手滑动动态载入数据,当向下滚动时,最下边显示 Loading… 。数据载入结束,Loading底栏消失。关于ListView的分段显示,有现成的库可用,比方 cwac-endless,
这个库不好之处,就是底部Loading的View无法定制。另一个在google code上的androidpageablelistview 这个能够实现主要的分页,有手动操作显示上一页,下一页的button。查阅了非常多资料,发现事实上ListView自带一个实现分页载入的方法,用到addFooterView/removeView
这两个函数“加入”或“去掉“ListView页脚。以下是一个研究ListView分页时做的一个Demo,比較简单,我把思路我源代码和大家分享一下,希望对大家有所帮助。

效果图: 

实现思路如是:用onScroll方法实现”滑动“后处理检查是否还有新的记录,假设有,调用addFooterView,加入记录到adapter,
adapter调用 notifyDataSetChanged 更新数据;假设没有记录了, 把自己定义的mFooterView去掉。这里没有重写onScrollStateChanged函数,那么在onScroll就须要一个外部变量mFirstCell记录滑动位置。

代码例如以下:

import android.app.ListActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AbsListView;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.ProgressBar;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AbsListView.OnScrollListener;

import android.widget.LinearLayout.LayoutParams;

/**

*

* @author huangbq

*

*/

public class MainActivity extends ListActivity implements OnScrollListener {

private static final String TAG = "MainActivity";

private listViewAdapter adapter = new listViewAdapter();

ListView listView ;

private int lastItem = 0;

LinearLayout loadingLayout;

/**

* 设置布局显示属性

*/

private LayoutParams mLayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);

/**

* 设置布局显示目标最大化属性

*/

private LayoutParams FFlayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);

private ProgressBar progressBar;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Log.i(TAG, "onCreate(Bundle savedInstanceState)>>>>>>>>>>>>>>>" );

//线性布局

LinearLayout layout = new LinearLayout(this);

//设置布局 水平方向

layout.setOrientation(LinearLayout.HORIZONTAL);

//进度条

progressBar = new ProgressBar(this);

//进度条显示位置

progressBar.setPadding(0, 0, 15, 0);

//把进度条增加到layout中

layout.addView(progressBar, mLayoutParams);

//文本内容

TextView textView = new TextView(this);

textView.setText("载入中...");

textView.setGravity(Gravity.CENTER_VERTICAL);

//把文本增加到layout中

layout.addView(textView, FFlayoutParams);

//设置layout的重力方向,即对齐方式是

layout.setGravity(Gravity.CENTER);

//设置ListView的页脚layout

loadingLayout = new LinearLayout(this);

loadingLayout.addView(layout, mLayoutParams);

loadingLayout.setGravity(Gravity.CENTER);

//得到一个ListView用来显示条目

listView = getListView();

//加入到页脚显示

listView.addFooterView(loadingLayout);

//给ListView加入适配器

setListAdapter(adapter);

//给ListView注冊滚动监听

listView.setOnScrollListener(this);

}

@Override

public void onScroll(AbsListView v, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

Log.i(TAG , "Scroll>>>first: " + firstVisibleItem + ", visible: " + visibleItemCount + ", total: " + totalItemCount);

lastItem = firstVisibleItem + visibleItemCount - 1;

Log.i(TAG , "Scroll>>>lastItem:" + lastItem);

//显示50条ListItem,即0-49,由于onScroll是在“滑动”运行过之后才触发,所以用adapter.count<=41作条件

if (adapter.count<=41) {

if (firstVisibleItem+visibleItemCount==totalItemCount) {

adapter.count += 10;

adapter.notifyDataSetChanged();

listView.setSelection(lastItem);

int currentPage=adapter.count/10;

Toast.makeText(getApplicationContext(), "第"+currentPage+"页", Toast.LENGTH_LONG).show();

}

}

else {

listView.removeFooterView(loadingLayout);

}

}

@Override

public void onScrollStateChanged(AbsListView v, int state) {

if (lastItem == adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE) {

Log.i(TAG,"ScrollStateChanged>>>state:"+state+"lastItem:" + lastItem);

//显示50条ListItem,即0-49,由于onScrollStateChanged是在“拖动滑动”运行过之后才触发,所以用adapter.count<=41作条件

if (adapter.count<=41) {

adapter.count += 10;

adapter.notifyDataSetChanged();

}

}

}

/**

* 要用用于生成显示数据

* @author huangbq

*

*/

class listViewAdapter extends BaseAdapter {

int count = 10;

public int getCount() {

Log.i(TAG, "getCount>>>count:" + count);

return count;

}

public Object getItem(int pos) {

Log.i(TAG, "getItem>>>pos:" + pos);

return pos;

}

public long getItemId(int pos) {

Log.i(TAG, "getItemId>>>ItemId:" + pos);

return pos;

}

public View getView(int pos, View v, ViewGroup p) {

Log.i(TAG, "getView>>>pos:" + pos);

TextView view;

if (v==null) {

view = new TextView(MainActivity.this);

}

else {

view=(TextView)v;

}

view.setText("ListItem " + pos);

view.setTextSize(20f);

view.setGravity(Gravity.CENTER);

view.setHeight(60);

return view;

}

}

}

demon下载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=52761

方案四:

这里仅仅给出关键代码,数据库和adapter自己去写吧,实现了listview的上下缓存。数据是从数据库得到的

public class HomeActivity extends Activity {

/** Called when the activity is first created. */

TextView mTextView;

ListView mListView;

MusicListViewAdapter mMusicListViewAdapter;

boolean isLoadingMusicData = false;

// 当前能够显示的LinkedList数据集合

LinkedList<Music> nowMusicList;

// 每次查询多少条数据

int pageSize = 15;

// 一共多少页数据

long pageCount;

// 记录查询结果总数

long resultTotCount;

// 顶端缓存数据为第几页

int topCachePageNumber;

// 底端缓存数据为第几页

int bottomCachePageNumber;

// 顶端缓存未插入LinkedList数据--OnScrollListener事件改变

LinkedList<Music> cacheTopList;

// 底端缓存未插入LinkedList数据--OnScrollListener事件改变

LinkedList<Music> cacheBottomList;

// 是否可显示到全部数据顶端

boolean isViewAllDataTop;

// 是否可显示到全部数据底端

boolean isViewAllDataBottom;

// 是否已经缓存到全部数据顶端

boolean isCacheAllDataTop;

// 是否已经缓存到全部数据底端

boolean isCacheAllDataBottom;

// 能够显示的顶端ItemView相应数据库查询结果第几条

int topViewListToDbPosition;

// 能够显示的底端ItemView相应数据库查询结果第几条

int bottomViewListToDbPosition;

// 能够显示的顶端ItemView相应数据库查询结果页数

int topViewListToPagePosition;

// 能够显示的底端ItemView相应数据库查询结果页数

int bottomViewListToPagePosition;

// 顶端剩余未显示的ItemView--OnScrollListener事件改变

int topNoShowItemViewCount;

// 底端剩余未显示的ItemView--OnScrollListener事件改变

int bottomNoShowItemViewCount;

// 当前显示的最顶端--OnScrollListener事件改变

int topItemViewPosition;

// 当前显示的最底端--OnScrollListener事件改变

int bottomItemViewPosition;

// 重要!推断向上滚动还是向下滚动 --滚动前显示的最顶端--OnScrollListener事件改变

int oldTopItemViewPosition = -1;

// 重要!推断向上滚动还是向下滚动 --滚动前显示的最底端--OnScrollListener事件改变

int oldBottomItemViewPosition = -1;

// 记录是滚动方向--OnScrollListener事件改变--事实上不须要在这里定义

int isUpScroll = 0;

// 是否须要添加顶端缓存数据--OnScrollListener事件改变--事实上不须要在这里定义

boolean needCacheTopList;

// 是否须要添加底端缓存数据--OnScrollListener事件改变--事实上不须要在这里定义

boolean needCacheBottomList;

// 是否须要删除顶端缓存数据--OnScrollListener事件改变--事实上不须要在这里定义

boolean needDelCacheTopList;

// 是否须要删除底端缓存数据--OnScrollListener事件改变--事实上不须要在这里定义

boolean needDelCacheBottomList;

// 是否应该追加顶端ItemView--OnScrollListener事件改变--事实上不须要在这里定义

boolean needAddTopItemView;

// 是否应该追加底端ItemView--OnScrollListener事件改变--事实上不须要在这里定义

boolean needAddBottomItemView;

// 是否应该追加顶端ItemView--OnScrollListener事件改变--事实上不须要在这里定义

boolean needDelTopItemView;

// 是否应该追加底端ItemView--OnScrollListener事件改变--事实上不须要在这里定义

boolean needDelBottomItemView;

// 是否正在更新

boolean isUping = true;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// 获得符合查询条件记录的总数ResultSet totality

resultTotCount = MusicAppliction.mListViewUtil.getAllMusicCount();

// 依据每页大小计算分页数量

pageCount = resultTotCount / pageSize + 1;

// 连续取最初2页数据并给nowMusicList赋值,用于初始化显示

nowMusicList = MusicAppliction.mListViewUtil.getMusicListLimit(0,

pageSize * 2 - 1);

Log.i("getMusicListLimit", "size:" + nowMusicList.size());

// 设置当前能够显示ItemView相应数据库查询结果

// 能够显示的顶端ItemView相应数据库查询结果第几条

topViewListToDbPosition = 0;

// 能够显示的底端ItemView相应数据库查询结果第几条

if (pageCount > 2) {

bottomViewListToDbPosition = pageSize * 2 - 1;

} else {

bottomViewListToDbPosition = nowMusicList.size() - 1;

}

// 是否可显示到全部数据顶端

isViewAllDataTop = true;

// 是否可显示到全部数据底端

if (pageCount <= 2) {

isViewAllDataBottom = true;

} else {

isViewAllDataBottom = false;

}

// 能够显示的顶端ItemView相应数据库查询结果页数

topViewListToPagePosition = 1;

// 能够显示的底端ItemView相应数据库查询结果页数

if (pageCount >= 2) {

bottomViewListToPagePosition = 2;

} else if (pageCount == 1) {

bottomViewListToPagePosition = 1;

}

// 是否已经缓存到全部数据顶端

isCacheAllDataTop = true;

// 是否已经缓存到全部数据底端

if (pageCount > 2) {

isCacheAllDataBottom = false;

} else {

isCacheAllDataBottom = true;

}

// 顶端缓存数据为第几页

topCachePageNumber = -1;

// 底端缓存数据为第几页

bottomCachePageNumber = -1;

// 顶端的缓存数据

cacheTopList = null;

// 底端的缓存数据

cacheBottomList = null;

// 找到显示音乐的ListView

mListView = (ListView) findViewById(R.id.MusicListView);

// 创建Adapter给ListView显示

mMusicListViewAdapter = new MusicListViewAdapter(this, nowMusicList);

// 组合Adapter和ListView

mListView.setAdapter(mMusicListViewAdapter);

mListView.setOnScrollListener(mOnScrollListener);

mListView.setFocusable(true);

mListView.forceLayout();

// 声明初始化isUping完成

isUping = false;

}

public void initTestData() {

// 建立初始化数据库和建立相关的表

// InitDataBaseTable继承自线程

// 初始化后调用须要运行start()方法

InitDataBaseTable mInitDataBaseTable = new InitDataBaseTable(this);

// 运行一个线程,用来在后台初始化数据库和表

mInitDataBaseTable.start();

}

OnScrollListener mOnScrollListener = new OnScrollListener() {

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

if (isUping) {

return;

}

// 假设能够显示全部数据页则退出

if (topViewListToPagePosition == 1

&& pageCount == bottomViewListToPagePosition

&& firstVisibleItem == 0) {

return;

}

// ------计算并赋值

// 顶端剩余未显示的ItemView--OnScrollListener事件改变

topNoShowItemViewCount = firstVisibleItem;

// 底端剩余未显示的ItemView--OnScrollListener事件改变

bottomNoShowItemViewCount = totalItemCount - firstVisibleItem

- visibleItemCount;

// 当前显示的最顶端--OnScrollListener事件改变

topItemViewPosition = firstVisibleItem;

// 当前显示的最底端--OnScrollListener事件改变

bottomItemViewPosition = visibleItemCount + firstVisibleItem;

//剔除ListView刷新后的Item混乱

if (oldTopItemViewPosition + pageSize == topItemViewPosition) {

Log.i("testa", "oldTopItemViewPosition+pageSize");

oldTopItemViewPosition = topItemViewPosition;

// isUpScroll = 0;

return;

}

//剔除ListView刷新后的Item混乱

if (oldTopItemViewPosition == topItemViewPosition + pageSize) {

Log.i("testa", "topItemViewPosition+pageSize");

oldTopItemViewPosition = topItemViewPosition;

// isUpScroll = 0;

return;

}

//声明正在更新

isUping = true;

// ------推断是否须要添加或删除顶端缓存Cache数据

// 推断是滚动方向是否向下

if (oldTopItemViewPosition < topItemViewPosition

|| (oldTopItemViewPosition - pageSize == topItemViewPosition)) {

// 推断是否须要删除顶端多余ItemView

// 同一时候更新顶端List缓存

// 同一时候更新各种位置标志

//Log.i("inUpBottom", "bottomCachePageNumber:"+bottomCachePageNumber);

//推断是否为初始化的向下滚动

if (bottomCachePageNumber == -1) {

// 推断是否有底端数据能够载入

if (pageCount > 2) {

bottomCachePageNumber = 1;

cacheBottomList = MusicAppliction.mListViewUtil

.getMusicListLimit(++bottomCachePageNumber

* pageSize, (bottomCachePageNumber + 1)

* pageSize - 1);

}

// 将底端cache的数据追增加nowMusicList

nowMusicList.addAll(cacheBottomList);

} else if (bottomNoShowItemViewCount < pageSize

) {

//不是初始化的向下滚动则进行略微复杂一点的计算

//推断是否为向上滚动后的向下滚动,防止中间丢失1页

if(isUpScroll == 1){

--bottomCachePageNumber;

}

isUpScroll = 2;

//缓存一个底部页

cacheBottomList = MusicAppliction.mListViewUtil

.getMusicListLimit(++bottomCachePageNumber

* pageSize, (bottomCachePageNumber + 1)

* pageSize - 1);

//将底部页追加到列表

nowMusicList.addAll(cacheBottomList);

//推断是否须要删除顶部页

if (topNoShowItemViewCount > pageSize) {

for (int i = 0; i < pageSize; i++) {

nowMusicList.removeFirst();

}

//更新顶部下次须要加载时的起始页

++topCachePageNumber;

Log.i("topCachePageNumber", "++topCachePageNumber");

}

}

} else if (oldTopItemViewPosition > topItemViewPosition

|| (oldTopItemViewPosition == topItemViewPosition

- pageSize)) {

// 推断是否须要删除底端多余ItemView

// 同一时候更新底端List缓存

// 同一时候更新各种位置标志

//                                Log.i("inUpTop", "topCachePageNumber:" + topCachePageNumber);

//推断是否顶部数据须要追加

if (topNoShowItemViewCount < pageSize) {

Log.i("inUpTop", "应该追加顶部");

if (topCachePageNumber >= 1) {

//防止向上滚动丢失一页

if(isUpScroll == 2){

++topCachePageNumber;

}

//标示如今是向上滚动

isUpScroll = 1;

//取得须要追加的顶部数据

cacheTopList = MusicAppliction.mListViewUtil

.getMusicListLimit(--topCachePageNumber

* pageSize, (topCachePageNumber + 1)

* pageSize - 1);

//倒序增加东部数据

for (int i = cacheTopList.size(); i > 0; i--) {

nowMusicList.add(0, cacheTopList.get(i - 1));

}

}

}

//更新底部数据

if (bottomNoShowItemViewCount > pageSize*2) {

//删除多余的底部数据

for (int i = 0; i < pageSize; i++) {

nowMusicList.removeLast();

}

//标示如今是向上滚动

isUpScroll = 1;

//改动下次追加底部数据的起始页

//当底部缓存页面小于2的时候将不再降低

if(bottomCachePageNumber>2){

--bottomCachePageNumber;

}

Log.i("MybottomCachePageNumber", "bottomCachePageNumber:"+bottomCachePageNumber);

}

}

//                        Log.i("OnScrollListener", "--oldTopItemViewPosition:"

//                                        + oldTopItemViewPosition + "--topItemViewPosition:"

//                                        + topItemViewPosition);

oldTopItemViewPosition = topItemViewPosition;

mMusicListViewAdapter.notifyDataSetChanged();

isUping = false;

}

};

}

方案五:

 ListView是Android中最为经常使用的列表类型控件,ListView中的选择项目中样式非常多有的是纯文字的、有的还能够带有图片。它的继承关系例如以下:

  java.lang.Object

  android.view.View

  android.view.ViewGroup

  android.widget.AdapterView<T extends android.widget.Adapter>

  android.widget.AbsListView

  android.widget.ListView

  android.widget.ListView继承了android.view.ViewGroup。

  首先看一个纯文本的ListView样例,案例执行后会出现一个城市列表如图6-8所看到的,选择某个城市,弹出一个Toast,关于Toast的概念和使用会在下一节中介绍。

  程序代码请參考代码

    chapter6_3/src/com/work/ListView_1_Activity.java

  public class ListView_1_Activity extends Activity {

  private ListView listview;

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.listview_activity);

  listview = (ListView)findViewById(R.id.ListView01);

  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,

  android.R.layout.simple_list_item_1, mStrings);

  listview.setAdapter(adapter);

  listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override

  public void onItemClick(AdapterView<?> parent, View v, int pos,

  long id) {

  Toast.makeText(ListView_1_Activity.this, mStrings[pos],

  Toast.LENGTH_SHORT).show();

  }

  });

  }

  private String[] mStrings = {

  "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …};

  }

  对 于ArrayAdapter应该已经非常熟悉了,当中的android.R.layout.simple_list_item_1是使用系统的布局样式。 Android系统本身提供了非常多的这种布局文件,可是有的适合于ListView控件,有的适合于Spinner控件,有的适合于它的列表控件,这是
使用时须要注意的。

  在这样的方式下,须要在布局文件listview_activity。xml中加入ListView控件:

  <ListView android:id="@+id/ListView01" android:layout_width="wrap_content"

  android:layout_height="wrap_content"></ListView>

  由 于ListView在Android中是非经常常使用的列表类型控件,仅仅要是有多条信息须要显示的时候都能够考虑使用ListView展示出来,正是因为 ListView使用的普遍,所以Android又提供了一个列表类型的Activity——ListActivity,来简化ListView开发。

  通过继承ListActivity类而实现一个简单的ListView功能,而不要直接使用ListView控件。相同上面案例假设使用ListActivity请參考代码清单:

    chapter6_3/src/com/work/ListView_1.java

  public class ListView_1 extends ListActivity {

  /** Called when the activity is first created. */

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setListAdapter(new ArrayAdapter<String>(this,

  android.R.layout.simple_list_item_1, mStrings));

  getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override

  public void onItemClick(AdapterView<?> parent, View v, int pos,

  long id) {

  Toast.makeText(ListView_1.this, mStrings[pos],

  Toast.LENGTH_SHORT).show();

  }

  });

  }

  private String[] mStrings = {

  "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …};

  }

  查 看代码不难发现这里没有使用布局文件,那就意味着不须要使用R文件来获得控件,所以在程序中使用了getListView()方法来获得ListView 控件。处理ListView的项目点击事件有两种方法,一种是通过与ListView对象设置setOnItemClickListener方式实现,代
码例如以下:

  getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override

  public void onItemClick(AdapterView<?> parent, View v, int pos,

  long id) {

  Toast.makeText(ListView_1.this, mStrings[pos],

  Toast.LENGTH_SHORT).show();

  }

  });

  第二种是覆盖ListActivity的onListItemClick(ListView l, View v, int position, long id)方法实现,代码例如以下所看到的。

  @Override

  protected void onListItemClick(ListView l, View v, int position, long id) {

  Toast.makeText(ListView_1.this, mStrings[position], Toast.LENGTH_SHORT)

  。show();

  }

  再看一个自己定义Adapter的样例,这是一个带有图标的ListView,

  自己定义adapter

  相关程序代码请參考代码清单:

   chapter6_3/src/com/work/ListViewIcon_3.java

  public class ListViewIcon_3 extends ListActivity {

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setListAdapter(new EfficientAdapter(this));

  }

  private static final String[] DATA = {

  "北京市", "天津市", "上海", "重庆", "哈尔滨",

  "石家庄", "秦皇岛", "济南", "青岛", "南京",

  "三亚", "昆明", "成都", "长沙", "武汉",

  "九江", "香港", "澳门","兰州","张家口" };

  …

  }

  自己定义的Adapter是EfficientAdapter,EfficientAdapter的相关代码请參考代码清单:

  chapter6_3/src/com/work/ListViewIcon_3.java

  private static class EfficientAdapter extends BaseAdapter {

  private LayoutInflater mInflater;

  private Bitmap mIcon0;

  private Bitmap mIcon1;

  …  …

  public EfficientAdapter(Context context) {

  mInflater = LayoutInflater.from(context);

  mIcon0 = BitmapFactory.decodeResource(context.getResources(), R.drawable.noicon);

  mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.beijing);

  …   …

  }

  public int getCount() {

  return DATA.length;

  }

  public Object getItem(int position) {

  return DATA[position];

  }

  public long getItemId(int position) {

  return position;

  }

  public View getView(int position, View convertView, ViewGroup parent) {

  ViewHolder holder;

  if (convertView == null) {

  convertView = mInflater。inflate(R.layout.main, null);

  holder = new ViewHolder();

  holder.text = (TextView) convertView.findViewById(R.id.textview);

  holder.icon = (ImageView) convertView.findViewById(R.id.icon);

  convertView.setTag(holder);

  } else {

  holder = (ViewHolder) convertView.getTag();

  }

  holder.text.setText(DATA[position]);

  switch(position)

  {

  case 0:

  holder.icon.setImageBitmap(mIcon1);

  break;

  case 1:

  holder.icon.setImageBitmap(mIcon2);

  break;

  …

  default:

  holder.icon.setImageBitmap(mIcon0);

  break;

  }

  return convertView;

  }

  static class ViewHolder {

  TextView text;

  ImageView icon;

  }

  }

  编写自己定义Adapter能够继承BaseAdapter类,假设是数据库使用能够继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现以下的方法:

   int getCount() 返回总数据源中总的记录数;

  Object getItem(int position) 依据选择的项目的位置,获得选择的数据源中某个项目的数据;

   long getItemId(int position) 依据选择的项目的位置;

  View getView(int position, View convertView, ViewGroup parent) 获得要展示的项目View对象。

  这 里最为麻烦的方法就是getView(),getView()方法是ListView的每一个列表项目绘制在屏幕上时被调用。该方法当中的一个參数是 convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退
出屏幕,屏幕以下原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,以下代码的处理对于提供ListView控件提高性 能是至关重要的。

  if (convertView == null) {

  convertView = mInflater.inflate(R.layout.main, null);

  holder = new ViewHolder();

  holder.text = (TextView) convertView

  .findViewById(R.id.textview);

  holder.icon = (ImageView) convertView.findViewById(R.id.icon);

  convertView.setTag(holder);

  } else {

  holder = (ViewHolder) convertView.getTag();

  }

  仅仅 有在convertView为null时才去实例化控件,创建convertView对象、holder对象,当中convertView对象是通过 mInflater。inflate(R.layout.main, null)方法,从一个main.xml布局文件里载入并创建的。

  而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目非常多时,用户重复滑动屏幕会有“卡”的感觉,不再流畅了。

  ViewHolder 类是将每个项目中的控件封装起来的类,能够在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到 convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类
的实例,这样在翻屏的时候就不会重复创建ViewHolder实例对象了,就本例而言仅仅是创建了9个ViewHolder实例。

方案六:AsyncTask, json;

代码介绍:

  初学android,写了个一小demo。功能非常easy,主要是用来学习,

  知识要点:

  1.android全局变量的使用(用来缓存爬取的数据)。

  2.AsyncTask使用。

  3.进度条载入数据

  4.利用Jsoup爬取网页数据并解析

demon:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=172517

方案七:下拉载入

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=172777

时间: 2024-11-08 23:29:46

listview分页载入问题的相关文章

android中listview分页载入数据

前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方案有三种:1,假设自己定义适配器,那么在getView方法中推断contentView是否为空,假设为空创建contentView并返回,假设不为空直接返回contentView.这样能尽可能少创建view.2.给contentView设置tag,传入一个viewHoder对象,用于缓存要实现的数据

Android ListView分页载入(服务端+android端)Demo

Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源码: 服务端: 须要导入图中这几个jar包. 在执行Android端代码前,须要开启服务端: 以下先给出服务端的代码: 类EmpDataSource: package com.andr

Android ListView分页,动态添加数据

1.ListView分页的实现,重点在于实现OnScrollListener接口,判断滑动到最后一项时,是否还有数据可以加载, 我们可以利用listView.addFootView(View v)方法进行提示 自定义一个ListView(这里本来想进行一些自定已修改的...实际代码并没有做)CornerListView package com.example.testlistview; import android.widget.AbsListView; import android.conte

有关Listview分页以及判断Listview是否已经滚动到低端的一些探索

在体验其他设计优美的app时加载动画的假象让我以为Listview的最后一条item完全显示之后才正式加载,导致我走入了一个误区浪费了很长的一段时间,最终我也是妥协以最后一条item刚被暴露开始作为Listview滚动到底部的标志,也就是说无须费很大劲去实现一个并没有多大提升的细节了.期间当然发现了一些很好的解决办法, 其一(网上引用的代码,原始出处不详,故不注明了): 1 private int getLastVisiblePosition = 0, lastVisiblePositionY

Android ListView分页加载(服务端+android端)Demo

Android ListView分页加载功能 在实际开发中经常用到,是每个开发者必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了测试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源代码: 服务端: 需要导入图中这几个jar包. 在运行Android端代码前,需要开启服务端: 下面先给出服务端的代码: 类EmpDataSource: package com.android

ListView分页加载数据

在android软件开发中,ListView是一种经常被用到的组件.当需要用到列表显示的时候,通常都会用到.而使用的过程中也可能出现一些问题.比如,一次性加载过多的Item对于手机有限的内存来说,是一种负担.于是就有了分页加载的技术,一般的说,分页的使用方式有两种,一是在滑动到底部的时候,自动加载下一部分的内容.另一种则是在底部添加一个类似按钮的控件,点击后加载内容.这里介绍的是第一种.同样的,代码来自github,网址是:https://github.com/nicolasjafelle/Pa

Android --ListView分页

参考博客:Android ListView分页加载(服务端+android端)Demo 监听OnScrollListener事件 class OnListScrollListener implements AbsListView.OnScrollListener{ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { /** * 当分页操作is_divPage为true时.滑动停止时.且pa

Android - ListView 滑动载入下页数据 Scroll设定

Android - ListView 下滑载入新数据 遇到问题,过去的下滑载入功能很差,不知道原因. 试了半天终于试出来了. 觉得这个方法比较符合使用者体验的感觉, 不会感觉上视觉有跳动的感觉,而是很直直的载入,很顺. 以下是我设定的onScrollListener private OnScrollListener scrollListener = new OnScrollListener() { @Override public void onScroll(AbsListView view,

WPF 实现 DataGrid/ListView 分页控件

在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,2000条数据,一次性显示在一个页面中,不仅消耗资源,而且用户体验也很糟糕.这篇博客将介绍如何创建一个分页控件. 为了简单起见,这个分页控件目前只有 首页/上一页/下一页/末页/总页数/第几页 等功能.实现思路,首页/上一页/下一页/末页 这四个通过路由事件来实现,在使用时可以使用命令进行绑定,或者直接使用均可.总页数和第几页通过依赖属性来实现,使用时将页数进行绑定显示