基于BaseAdapter的Listview小Demo

简介:

ListView是Android开发中比较常用的控件,

其中适配器模式可以选择:

ArrayAdapter:简单易用,通常用于将数组或者List集合的读个包值封装成多个列表项

SimpleAdapter:其实功能很强大将数组或者List集合的读个包值封装成多个列表项

SimpleCursorAdapter:与SimpleAdapter基本类似只是用于包装Cursor提供的数据

BaseAdapter:通常用于被扩展,扩展BaseAdapter可以对各列表项进行最大的定制

而且ListView组件提供了两个很实用的功能,那就是可以在顶部和底部添加自定义的视图,今天自己做了一下小Demo加深一下这个控件的使用,实现分批显示的功能,即在一个手机屏幕下方放置一个加载更多的按钮,点击之后更新下一页的内容,详细注释均在代码中



首先定义一个activity_main.xml,为了防止listview中点击有黄色背景或者滑动出现黑色背景加了 android:cacheColorHint="#000000"      android:listSelector="@android:color/transparent"

[html]  view plain  copy
  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="fill_parent"  
  5.     android:orientation="vertical"  
  6.     android:paddingLeft="3dp"  
  7.     android:paddingRight="3dp" >  
  8.     <!-- 这里我们用到了Android内置名为list的id,后面要用到ListActivity -->  
  9.     <ListView  
  10.         android:id="@id/android:list"  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:cacheColorHint="#000000"   
  14.         android:listSelector="@android:color/transparent"/>  
  15.           
  16. </LinearLayout>  


然后就是list_item.xml,作为listview的布局文件,比较简单

[html]  view plain  copy
  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.   
  7.     <TextView    
  8.         android:id="@+id/list_item_text"    
  9.         android:layout_width="fill_parent"    
  10.         android:layout_height="fill_parent"    
  11.         android:gravity="center"    
  12.         android:textSize="20sp"    
  13.         android:paddingTop="10dp"    
  14.         android:paddingBottom="10dp"/>    
  15. </LinearLayout>  
  16.   
  17. <!-- 这里ListView中单个列表的布局文件 -->  

接着就是底部加载更多的视图more.xml

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout    
  3.   xmlns:android="http://schemas.android.com/apk/res/android"    
  4.   android:orientation="vertical"    
  5.   android:layout_width="fill_parent"    
  6.   android:layout_height="wrap_content">    
  7.   <Button    
  8.         android:id="@+id/loadMoreButton"    
  9.         android:layout_width="fill_parent"    
  10.         android:layout_height="wrap_content"    
  11.         android:text="更多显示请点击"    
  12.         android:onClick="loadMore"/>    
  13. </LinearLayout>   


适配器作为连接Activity和数据格式的过度器件,这里定义如下,代码中有着详细的注释

[java]  view plain  copy
  1. package com.xsf.listviewtest;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.content.Context;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.TextView;  
  11.   
  12. import com.example.listviewtest.R;  
  13. /* 
  14.  * 继承BaseAdapter实例化需要Context对象来获取LayoutInflater实例和一个集合来充当适配器的数据收集 
  15.  * 在getView方法中填充list_item.xml布局文件完成每一项的数据显示 
  16.  * addItem方法用来加载数据时向数据集合中添加新的数据 
  17.  */  
  18. public class ListViewAdapter extends BaseAdapter {  
  19.     private List<String> items;  
  20.     //LayoutInflater的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout文件夹下的xml布局文件,并且实例化!  
  21.     private LayoutInflater inflater;  
  22.   
  23.     public ListViewAdapter(Context context, List<String> items) {  
  24.         this.items = items;  
  25.         inflater = (LayoutInflater) context  
  26.                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  27.     }  
  28.   
  29.     @Override  
  30.     public int getCount() {  
  31.         return items.size();  
  32.     }  
  33.   
  34.     @Override  
  35.     public Object getItem(int position) {  
  36.         return items.get(position);  
  37.     }  
  38.   
  39.     @Override  
  40.     public long getItemId(int position) {  
  41.         return position;  
  42.     }  
  43.   
  44.     @Override  
  45.     public View getView(int position, View view, ViewGroup parent) {  
  46.         if (view == null) {  
  47.             view = inflater.inflate(R.layout.list_item, null);  
  48.         }  
  49.         TextView text = (TextView) view.findViewById(R.id.list_item_text);  
  50.         text.setText(items.get(position));  
  51.         return view;  
  52.     }  
  53.   
  54.     /** 
  55.      * 添加列表项 
  56.      *  
  57.      * @param item 
  58.      */  
  59.     public void addItem(String item) {  
  60.         items.add(item);  
  61.     }  
  62. }  


最后就是MainActivity,主要用到了 onScroll(AbsListView view, int firstVisibleItem  int visibleItemCount, int totalItemCount)其中firstVisibleItem表示在现时屏幕第一个ListItem(部分显示的ListItem也算)在整个ListView的位置(下标从0开始),visibleItemCount表示在现时屏幕可以见到的ListItem(部分显示的ListItem也算)总数,totalItemCount表示ListView的ListItem总数

[java]  view plain  copy
  1. package com.xsf.listviewtest;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.ListActivity;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.widget.AbsListView;  
  11. import android.widget.AbsListView.OnScrollListener;  
  12. import android.widget.Button;  
  13. import android.widget.ListView;  
  14.   
  15. import com.example.listviewtest.R;  
  16.   
  17. public class MainActivity extends ListActivity implements OnScrollListener {  
  18.     private ListView listView;  
  19.     private int visibleLastIndex = 0// 最后的可视项索引  
  20.     private int visibleItemCount; // 当前窗口可见项总数  
  21.     private ListViewAdapter adapter;  
  22.     private View loadMoreView;  
  23.     private Button loadMoreButton;  
  24.     private Handler handler = new Handler();// 多线程处理handler  
  25.   
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.         /** 
  31.          * LayoutInflater这个类的作用类似于findViewById(), 不同点: 
  32.          * LayoutInflater是用来找layout下xml布局文件的,而且它会实例化 
  33.          * findViewById()是找具体xml布局文件下的具体widget控件,比如:Button按钮 
  34.          *  
  35.          * inflate就相当于将一个xml中定义的布局找出来.    
  36.          * 因为如果在一个Activity文件里直接用findViewById()这个方法的话, 
  37.          * 那么它所对应的是setConentView()中调用的那个layout里的组件.    
  38.          * 因此如果在同样的Activity里用到别的layout的话, 
  39.          * 而且你还要设置这个layout里的组件(比如:ImageView,TextView)上的内容, 
  40.          * 那么你就必须用inflate()先将这个layout找出来, 然后再用这个layout对象去找到它上面的组件 然后进行一系列的操作 
  41.          *  
  42.          * inflate()方法中参数: 1.想要用的布局文件的id 2.持有选项卡的内容,获取加载视图的xml 
  43.          * 3.null:将此处解析的xml文件不做为根视图View 
  44.          */  
  45.   
  46.         loadMoreView = getLayoutInflater().inflate(R.layout.more, null);// 每次解析都会出现新的视图不会出现引用问题  
  47.         loadMoreButton = (Button) loadMoreView  
  48.                 .findViewById(R.id.loadMoreButton);  
  49.         listView = getListView(); // 获取id是list的ListView  
  50.         /*ListView组件提供了两个很实用的功能,那就是可以在顶部和底部添加自定义的视图*/  
  51.         listView.addFooterView(loadMoreView);   //设置列表底部视图    
  52.         initAdapter();  
  53.   
  54.         setListAdapter(adapter); // 自动为id是list的ListView设置适配器  
  55.   
  56.         listView.setOnScrollListener(this); // 添加滑动监听  
  57.   
  58.     }  
  59.   
  60.     /** 
  61.      * 初始化适配器 
  62.      */  
  63.     private void initAdapter() {  
  64.         ArrayList<String> items = new ArrayList<String>();  
  65.         for (int i = 0; i <10; i++) {  
  66.             items.add(String.valueOf(i + 1));  
  67.         }  
  68.         adapter = new ListViewAdapter(this, items);  
  69.   
  70.     }  
  71.   
  72.     /* 
  73.      * 滑动时被调用 
  74.      */  
  75.     @Override  
  76.     public void onScroll(AbsListView view, int firstVisibleItem,  
  77.             int visibleItemCount, int totalItemCount) {  
  78.         this.visibleItemCount = visibleItemCount;  
  79.         visibleLastIndex = firstVisibleItem + visibleItemCount - 1;  
  80.     }  
  81.   
  82.     /* 
  83.      * 滑动状态改变时被调用 
  84.      */  
  85.     @Override  
  86.     public void onScrollStateChanged(AbsListView view, int scrollState) {  
  87.         int itemsLastIndex = adapter.getCount() - 1// 数据集最后一项的索引  
  88.         int lastIndex = itemsLastIndex + 1// 加上底部的loadMoreView项  
  89.         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE  
  90.                 && visibleLastIndex == lastIndex) {  
  91.               
  92.             Log.i("MORE""loading...");  
  93.         }  
  94.   
  95.     }  
  96.   
  97.     /* 
  98.      * 点击按钮的事件 
  99.      */  
  100.     public void loadMore(View view) {  
  101.         loadMoreButton.setText("玩命加载中.....");// 设置按钮加载文字  
  102.         handler.postDelayed(new Runnable() {  
  103.   
  104.             @Override  
  105.             public void run() {  
  106.                 loadData();  
  107.                 adapter.notifyDataSetChanged();// 数据集变化后通知adapter  
  108.                 listView.setSelection(visibleLastIndex - visibleItemCount + 1);// 设置选中项  
  109.                 loadMoreButton.setText("more");// 回复按钮文字  
  110.   
  111.             }  
  112.         }, 3000);  
  113.     }  
  114.   
  115.     /* 
  116.      * 模拟加载数据 
  117.      */  
  118.     protected void loadData() {  
  119.         int count = adapter.getCount();  
  120.         for (int i = count; i < count + 10; i++) {  
  121.             adapter.addItem(String.valueOf(i + 1));  
  122.         }  
  123.   
  124.     }  
  125.   
  126. }  


转载:http://blog.csdn.net/xsf50717/article/details/44945779

目录
相关文章
|
10月前
|
Android开发
ListView和ArrayAdapter、SimpleAdapter适配器的简单使用
ListView和ArrayAdapter、SimpleAdapter适配器的简单使用
|
Web App开发
|
Android开发 数据格式 XML
|
Android开发
android AutoCompleteTextView 自定义BaseAdapter
最近项目中需要做搜索功能,实现类似 Google、Baidu 搜索的 下拉提示效果。Android为我们提供了 AutoCompleteTextView 控件来完成此功能。 网上好多例子都是简单使用 ArrayAdapter 来实现的,界面比较简单,实际项目中用处不大;自己研究了一番,自定义Adapter 继承BaseAdapter 并实现Filterable 接口 实现了上述功能。
1178 0