zoukankan      html  css  js  c++  java
  • 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. }
    最后看看效果:

             

          


            

  • 相关阅读:
    防止域名恶意指向的解决办法
    Spring @Configuration @Import
    CAS 集成认证
    远程桌面登录蓝色屏幕、不显示桌面怎么解决?
    终端服务器超出了最大允许连接数
    Fiddler 常见几种解决捕获不到请求的方法
    android TimerTask 的简单应用
    Android 数字签名学习笔记
    Android 遍历卡数据并按图片,音乐等分类保存
    Android 最简单的SD卡文件遍历程序
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3254935.html
Copyright © 2011-2022 走看看