android中listview分页加载数据

首 先说下listview的优化方案,这也是面试中常考的题目。优化方案有三种:1,如果自定义适配器,那么在getView方法中判断 contentView是否为空,如果为空创建contentView并返回,如果不为空直接返回contentView。这样能尽可能少创建view。 2.给contentView设置tag,传入一个viewHoder对象,用于缓存要实现的数据。3,如果listview中显示的item太多,就要 考虑分页加载了。

               下面就注意介绍一下分页加载数据。首先在layout下创建listview.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical" >

  6.     <ListView
  7.         android:id="@+id/listView1"
  8.         android:layout_width="match_parent"
  9.         android:layout_height="wrap_content" >
  10.     </ListView>

  11. </LinearLayout>

然后创建listview_item.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent">  
  6.     <TextView  
  7.         android:id="@+id/list_item_text"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         android:gravity="center"  
  11.         android:textSize="20sp"  
  12.         android:paddingTop="10dp"  
  13.         android:paddingBottom="10dp"/>  
  14. </LinearLayout>  

     再为跟多按钮添加一个xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="wrap_content"
  5.     android:gravity="center"
  6.     android:orientation="vertical" >

  7.     <Button
  8.         android:id="@+id/loadMoreButton"
  9.         android:layout_width="fill_parent"
  10.         android:layout_height="wrap_content"
  11.         android:onClick="loadMore"
  12.         android:text="加载更多" />

  13. </LinearLayout>

代码部分:

  1. public class ListViewAdapter extends BaseAdapter {

  2.         private static Map<Integer,View> m=new HashMap<Integer,View>();
  3.        
  4.         private List<String> items;
  5.         private LayoutInflater inflater;
  6.        
  7.         public ListViewAdapter(List<String> items, Context context) {
  8.                 super();
  9.                 this.items = items;
  10.                 this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  11.         }

  12.         @Override
  13.         public int getCount() {
  14.                 // TODO Auto-generated method stub
  15.                 return items.size();
  16.         }

  17.         @Override
  18.         public Object getItem(int position) {
  19.                 // TODO Auto-generated method stub
  20.                 return items.get(position);
  21.         }

  22.         @Override
  23.         public long getItemId(int position) {
  24.                 // TODO Auto-generated method stub
  25.                 return position;
  26.         }

  27.         @Override
  28.         public View getView(int position, View contentView, ViewGroup arg2) {
  29.                 // TODO Auto-generated method stub
  30.                 contentView=m.get(position);
  31.                 if(contentView==null){
  32.                         contentView=inflater.inflate(R.layout.listview_item, null);
  33.                         TextView text=(TextView) contentView.findViewById(R.id.list_item_text);
  34.                         text.setText(items.get(position));
  35.                 }
  36.                 m.put(position, contentView);
  37.                 return contentView;
  38.         }
  39.        
  40.         public void addItem(String item) {  
  41.         items.add(item);  
  42.     }  

  43. }
  1. public class ListViewActivity extends Activity implements OnScrollListener  {
  2.           List<String> items = new ArrayList<String>();  
  3.          private ListView listView;  
  4.             private int visibleLastIndex = 0;   //最后的可视项索引  
  5.             private int visibleItemCount;       // 当前窗口可见项总数  
  6.             private ListViewAdapter adapter;  
  7.             private View loadMoreView;  
  8.             private Button loadMoreButton;  
  9.             private Handler handler = new Handler();  
  10.           
  11.             @Override  
  12.             public void onCreate(Bundle savedInstanceState) {  
  13.                 super.onCreate(savedInstanceState);  
  14.                 setContentView(R.layout.listview);  
  15.                   
  16.                 loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null);  
  17.                 loadMoreButton = (Button) loadMoreView.findViewById(R.id.loadMoreButton);  
  18.                 loadMoreButton.setOnClickListener(new OnClickListener() {
  19.                                
  20.                                 @Override
  21.                                 public void onClick(View v) {
  22.                                         // TODO Auto-generated method stub
  23.                                         loadMoreButton.setText("正在加载...");   //设置按钮文字loading  
  24.                                 handler.postDelayed(new Runnable() {  
  25.                                     @Override  
  26.                                     public void run() {  
  27.                                          
  28.                                         loadData();  
  29.                                          
  30.                                         adapter.notifyDataSetChanged(); //数据集变化后,通知adapter  
  31.                                         listView.setSelection(visibleLastIndex - visibleItemCount + 1); //设置选中项  
  32.                                          
  33.                                         loadMoreButton.setText("加载更多");    //恢复按钮文字  
  34.                                     }  
  35.                                 }, 1000);  
  36.                                 }
  37.                         });
  38.                 listView = (ListView) this.findViewById(R.id.listView1);
  39.                   
  40.                 listView.addFooterView(loadMoreView);   //设置列表底部视图  
  41.                // listView.addHeaderView(v)    //设置列表顶部视图
  42.           
  43.                 initAdapter();  
  44.                   
  45.                 listView.setAdapter(adapter);                //自动为id是list的ListView设置适配器  
  46.                   
  47.                 listView.setOnScrollListener(this);     //添加滑动监听  
  48.                 listView.setOnItemClickListener(new OnItemClickListener() {

  49.                                 @Override
  50.                                 public void onItemClick(AdapterView<?> arg0, View view,
  51.                                                 int position, long arg3) {
  52.                                         // TODO Auto-generated method stub
  53.                                         Toast.makeText(getApplicationContext(), items.get(position),Toast.LENGTH_SHORT).show();
  54.                                 }
  55.                         });
  56.             }  
  57.              
  58.             /**
  59.              * 初始化适配器
  60.              */  
  61.             private void initAdapter() {  
  62.              
  63.                 for (int i = 0; i < 20; i++) {  
  64.                     items.add(String.valueOf(i + 1));  
  65.                 }  
  66.                 adapter = new ListViewAdapter(items,this);  
  67.             }  
  68.           
  69.             /**
  70.              * 滑动时被调用
  71.              */  
  72.             @Override  
  73.             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
  74.                 this.visibleItemCount = visibleItemCount;  
  75.                 visibleLastIndex = firstVisibleItem + visibleItemCount - 1;  
  76.             }  
  77.           
  78.             /**
  79.              * 滑动状态改变时被调用
  80.              */  
  81.             @Override  
  82.             public void onScrollStateChanged(AbsListView view, int scrollState) {  
  83.                 int itemsLastIndex = adapter.getCount() - 1;    //数据集最后一项的索引  
  84.                 int lastIndex = itemsLastIndex + 1;             //加上底部的loadMoreView项  
  85.                 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) {  
  86.                     //如果是自动加载,可以在这里放置异步加载数据的代码  
  87.                     Log.i("LOADMORE", "loading...");  
  88.                 }  
  89.             }  
  90.              

  91.             /**
  92.              * 模拟加载数据
  93.              */  
  94.             private void loadData() {  
  95.                 int count = adapter.getCount();  
  96.                 for (int i = count; i < count + 20; i++) {  
  97.                     adapter.addItem(String.valueOf(i + 1));  
  98.                 }  
  99.             }

  100.                
  101. }

 

最后看看效果:

 

         

      


        

posted @ 2013-08-13 12:59  brave-sailor  阅读(277)  评论(0编辑  收藏  举报