首页 > 代码库 > 使用ListView显示信息列表,用监听器和适配器,操作

使用ListView显示信息列表,用监听器和适配器,操作

2014-08-18

数据适配器: 是连接数据源和视图界面的桥梁

1、数组适配器(ArrayAdapter):用于绑定格式单一的数据

  数据源:可以是集合或数组

2、简单适配器(SimpleAdapter):用于绑定格式复杂的数据

  数据源:只能是特定泛型的集合

监听器: 程序和用户(或系统)交互的桥梁

OnScrollListener: 检测滚动的变化,可以用于视图在滚动中加载数据

OnItemClickListener: 用于处理视图中单个条目的点击事件

适配器数据的刷新

notifyDataChanged

 

 

数组适配器(ArrayAdapter)

1     <ListView2         android:id="@+id/listView1"3         android:layout_width="match_parent"4         android:layout_height="wrap_content"5         android:layout_alignParentLeft="true"6         android:layout_alignParentTop="true" >7     </ListView>
ListView XML文件
 
 1 public class MainActivity extends ActionBarActivity { 2     private ListView listView; 3     ArrayAdapter<String> arr_adapter; 4  5     @Override 6     protected void onCreate(Bundle savedInstanceState) { 7         super.onCreate(savedInstanceState); 8         setContentView(R.layout.fragment_main); 9         10         listView=(ListView) findViewById(R.id.listView1);11         /*     1、新建一个数据适配器12                 ArrayAdapter<>(上下文,加载所对应的布局文件,数据源)13             2、适配器加载数据源        */14         String[] arr_data =http://www.mamicode.com/ {15                 "星期1","星期2","星期3","星期4",16                 "星期5","星期6","星期7"    17         };18         arr_adapter=new ArrayAdapter<String>(MainActivity.this, 19                 android.R.layout.simple_list_item_1, arr_data);20         //3、视图(ListView)加载适配器21         listView.setAdapter(arr_adapter);22     }23 }
数组适配器:Java文件

 

 

简单适配器(SimpleAdapter)

 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="horizontal" > 6      7     <ImageView  8         android:id="@+id/pic" 9         android:layout_width="wrap_content"10         android:layout_height="wrap_content"11         android:layout_marginLeft="15dp"12         android:src="@drawable/ic_launcher"13     />14     15     <TextView 16         android:id="@+id/text"17         android:layout_width="wrap_content"18         android:layout_height="wrap_content"19         android:layout_marginLeft="15dp"20         android:textSize="20sp"21         android:textColor="#000000"22         android:text="demo"23         />24 25 </LinearLayout>
新建一页XML文件布局

 

 1 public class MainActivity extends ActionBarActivity { 2     private ListView listView; 3     private SimpleAdapter simp_adapter; 4     private List<Map<String, Object>> dataList; 5      6     @Override 7     protected void onCreate(Bundle savedInstanceState) { 8         super.onCreate(savedInstanceState); 9         setContentView(R.layout.fragment_main);10         11         /**12          * new SimpleAdapter(context, data, resource, from, to)13          * @context:上下文14          * @data: 数据源(List<? extends Map<String, ?>> data),15          *                 一个Map所组成的List集合16          *                 每一个Map都会去对应ListView列表中的一行17          *                 每个Map(键-值对) 中的键必须包含在所有在from中所指定的键18          * @resource: 列表项的布局文件ID19          * @from: Map中的键名20          * to: 绑定数据视图中的ID,与from成对应关系21          */22         listView = (ListView) findViewById(R.id.listView1);23         dataList = new ArrayList<Map<String, Object>>();24         25         simp_adapter=new SimpleAdapter(this, getData(), R.layout.item26                 ,new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text});27         28         listView.setAdapter(simp_adapter);29     }30     31     private List<Map<String, Object>> getData(){32         for (int i = 0; i < 20; i++) {33             Map<String,Object> map = new HashMap<String,Object>();34             map.put("pic",R.drawable.ic_launcher);35             map.put("text", "demo"+i);36             dataList.add(map);37         }38         39         return dataList;40     }
SimpleAdapter简单适配器JAVA代码

 

 

 

//添加监听事件,点击后出现吐司,返回位置信息

 1 public class MainActivity extends ActionBarActivity implements OnScrollListener,OnItemClickListener{ 2     private ListView listView; 3     private SimpleAdapter simp_adapter; 4     private List<Map<String, Object>> dataList; 5      6     @Override 7     protected void onCreate(Bundle savedInstanceState) { 8         super.onCreate(savedInstanceState); 9         setContentView(R.layout.fragment_main);10         11         /**12          * new SimpleAdapter(context, data, resource, from, to)13          * @context:上下文14          * @data: 数据源(List<? extends Map<String, ?>> data),15          *                 一个Map所组成的List集合16          *                 每一个Map都会去对应ListView列表中的一行17          *                 每个Map(键-值对) 中的键必须包含在所有在from中所指定的键18          * @resource: 列表项的布局文件ID19          * @from: Map中的键名20          * @to: 绑定数据视图中的ID,与from成对应关系21          */22         listView = (ListView) findViewById(R.id.listView1);23         dataList = new ArrayList<Map<String, Object>>();24         25         simp_adapter=new SimpleAdapter(this, getData(), R.layout.item26                 ,new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text});27         28         listView.setAdapter(simp_adapter);29         30         //加载事件监听器31         listView.setOnItemClickListener(this);32         listView.setOnScrollListener(this);33     }34     35     private List<Map<String, Object>> getData(){36         for (int i = 0; i < 20; i++) {37             Map<String,Object> map = new HashMap<String,Object>();38             map.put("pic",R.drawable.ic_launcher);39             map.put("text", "demo"+i);40             dataList.add(map);41         }42         43         return dataList;44     }45 46     //需求:点击项,返回位置,内容, 吐司,47     @Override48     public void onItemClick(AdapterView<?> parent, View view, int position,49             long id) {50         // TODO 自动生成的方法存根51         String text = listView.getItemAtPosition(position)+"";52         Toast.makeText(this, "position="+position+" text="+text, Toast.LENGTH_LONG).show();53         54     }55 56     @Override57     public void onScrollStateChanged(AbsListView view, int scrollState) {58         // TODO 自动生成的方法存根59         60     }61 62     @Override63     public void onScroll(AbsListView view, int firstVisibleItem,64             int visibleItemCount, int totalItemCount) {65         // TODO 自动生成的方法存根66     }67 }
在SimpleAdapter简单适配器的基础上添加监听事件

 

在上面的基础上添加监听滚动事件,在Log上输出滚动状态

在快速滑动时添加项目

 1 public class MainActivity extends ActionBarActivity implements OnScrollListener,OnItemClickListener{ 2     private ListView listView; 3     private SimpleAdapter simp_adapter; 4     private List<Map<String, Object>> dataList; 5      6     @Override 7     protected void onCreate(Bundle savedInstanceState) { 8         super.onCreate(savedInstanceState); 9         setContentView(R.layout.fragment_main);10         11         /**12          * new SimpleAdapter(context, data, resource, from, to)13          * @context:上下文14          * @data: 数据源(List<? extends Map<String, ?>> data),15          *                 一个Map所组成的List集合16          *                 每一个Map都会去对应ListView列表中的一行17          *                 每个Map(键-值对) 中的键必须包含在所有在from中所指定的键18          * @resource: 列表项的布局文件ID19          * @from: Map中的键名20          * @to: 绑定数据视图中的ID,与from成对应关系21          */22         listView = (ListView) findViewById(R.id.listView1);23         dataList = new ArrayList<Map<String, Object>>();24         25         simp_adapter=new SimpleAdapter(this, getData(), R.layout.item26                 ,new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text});27         28         listView.setAdapter(simp_adapter);29         30         //加载事件监听器31         listView.setOnItemClickListener(this);32         listView.setOnScrollListener(this);33     }34     35     private List<Map<String, Object>> getData(){36         for (int i = 0; i < 20; i++) {37             Map<String,Object> map = new HashMap<String,Object>();38             map.put("pic",R.drawable.ic_launcher);39             map.put("text", "demo"+i);40             dataList.add(map);41         }42         43         return dataList;44     }45 46     //需求:点击项,返回位置,内容, 吐司,47     @Override48     public void onItemClick(AdapterView<?> parent, View view, int position,49             long id) {50         // TODO 自动生成的方法存根51         String text = listView.getItemAtPosition(position)+"";52         Toast.makeText(this, "position="+position+" text="+text, Toast.LENGTH_LONG).show();53         54     }55 56     //手指在列表中滑动,滑动到底部,自动增加项目57     @Override58     public void onScrollStateChanged(AbsListView view, int scrollState) {59         // TODO 自动生成的方法存根60         switch(scrollState){61         case SCROLL_STATE_FLING:62             Log.i("Main","用户手指用力滑了一下,之后离开屏幕");63             Map<String, Object> map = new HashMap<String, Object>();64             map.put("pic", R.drawable.ic_launcher);65             map.put("text", "增加项");66             dataList.add(map);67             //控制UI线程刷新界面68             simp_adapter.notifyDataSetChanged();69             break;70         case SCROLL_STATE_IDLE:71             Log.i("Main", "视图停止滑动");72             break;73         case SCROLL_STATE_TOUCH_SCROLL:74             Log.i("main", "手指未离开屏幕,视图正在滑动");75             break;76         }77     }78 79     @Override80     public void onScroll(AbsListView view, int firstVisibleItem,81             int visibleItemCount, int totalItemCount) {82         // TODO 自动生成的方法存根83     }84 }
监听滚动事件