方案一:

底部有查看很多其它能够使用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

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

  1. android中listview分页载入数据

    前段时间做的新浪微博项目一直想实现listview分页载入数据,今天最终实现了,哈哈!感觉挺好的,今天又写了个demo给大家分享下. 首先说下listview的优化方案,这也是面试中常考的题目.优化方 ...

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

    Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEcli ...

  3. ListView分页显示

    出在:http://blog.csdn.net/tu_bingbing/article/details/13275107         当ListView要显示的数据过多时,为了更快的响应用户,这个 ...

  4. Android --ListView分页

    参考博客:Android ListView分页加载(服务端+android端)Demo 监听OnScrollListener事件 class OnListScrollListener implemen ...

  5. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...

  6. 【Android进阶】Listview分页加载数据的实现

    Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...

  7. ListView 分页 排序、编辑、插入和删除

    摘自网络地址:http://msdn.microsoft.com/zh-cn/magazine/cc337984.aspx ListView 基础 ListView 是模板驱动的控件,这意味着它默认情 ...

  8. Android ListView分页,动态添加数据

    1.ListView分页的实现,重点在于实现OnScrollListener接口,判断滑动到最后一项时,是否还有数据可以加载, 我们可以利用listView.addFootView(View v)方法 ...

  9. WPF 实现 DataGrid/ListView 分页控件

    在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,2000条数据,一次性显示在一个页面中,不仅消耗资源,而且用户体验也很糟 ...

随机推荐

  1. 前端项目课程3 jquery1.8.3到1.11.1有了哪些新改变

    web项目课程3  jquery1.8.3到1.11.1有了哪些新改变 一.总结 一句话总结:领会官方升级的意思.  1.live();    2.die();    3.bind();    4.u ...

  2. eclipse调试鼠标放上去显示变量值

    在eclipse中调试时,鼠标移动到变量上不显示值,这个原来自己也遇到过,没注意,反正就使用ctrl+shift+i嘛,也可以的,刚查了一下,解决方法如下: Window->Preference ...

  3. [PReact] Use Link State to Automatically Handle State Changes

    Storing and updating values inside a component’s local state (known as controlled components) is suc ...

  4. P2P网络借贷系统简要解读

    P2P网络借贷系统的核心功能其实很简单,就是若干投资者(借款人)集体把钱贷给贷款人,到期后,贷款人把利息和本金按时还给借款人.平台的主要作用是"撮合",收取一定的服务费和管理费. ...

  5. [转载]Ocelot简易教程(二)之快速开始2

    为什么这篇的标题叫“Ocelot简易教程(二)之快速开始2”呢,因为很多朋友跟我说上一篇“ Ocelot简易教程(二)之快速开始1”内容太少了,只是简单介绍Ocelot的一些简单配置,让Ocelot能 ...

  6. 【53.61%】【BZOJ 2302】[HAOI2011]Problem c

    Time Limit: 30 Sec Memory Limit: 256 MB Submit: 526 Solved: 282 [Submit][Status][Discuss] Descriptio ...

  7. Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...

  8. dnf游戏外怪原理

    dnf游戏外怪原理 一.总结 一句话总结:用钩子,修改内存.找到存储数据的内存,修改内存的执行代码达到修改数据的目的,修改了数据之后再改回来. 1.如何找到存储数据的内存? 然后数据变化,用软件找变化 ...

  9. [Angular] Adding keyboard events to our control value accessor component

    One of the most important thing when building custom form component is adding accessbility support. ...

  10. 【codeforces 760C】Pavel and barbecue

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...