学习目标:
1.理解ListView的基础使用
2.学会熟练运用两种适配器(ArrayAdapter、SimpleAdapter)
3.学会熟练运用两种监听器(OnScrollListener,OnItemClickListener)
4.学会熟练运用适配器数据的刷新(notifyDataChanged)
1.Listview:Android系统中显示列表的控件,每一个ListView都可以包含很多个列表项
2.数据适配器:把复杂的数据(数组、链表、数据库、集合等)填充在指定的视图界面上
ArrayAdapter(数组适配器):用于绑定格式单一的数据
数据源:可以是集合或数组
SimpleAdapter(简单适配器):用于绑定格式复杂的数据
数据源:只能是特定泛型的集合
数据适配器是连接数据源和视图界面的桥梁
实现过程:新建适配器-->添加数据源到适配器-->视图加载适配器
Example:
A.纯文本列表显示
ArrayAdapter:
(1)新建一个数据适配器:new ArrayAdapter<T>(context, textViewResourceId, objects);
(2)适配器加载数据源:String[] data;
(3)视图(ListView)加载适配器:listview.setAdapter(adapter);
代码:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
android:listSelector="#00000000"/>
</LinearLayout>
</pre><p></p><p><span style="font-family:SimSun; font-size:18px"><strong>代码:MainActivity.java</strong></span></p><strong><span style="font-family:Simsun; font-size:18px"></span></strong><p></p><pre class="java" name="code">package com.example.listview;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView listView;
private ArrayAdapter<String> arryAdapter;
private String[]data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.lv);
//2.适配器加载数据源
data=new String[]{"zmj one","zmj two","zmj three","zmj four"};
//1.新建一个数据适配器,ArrayAdapter(上下文,当前ListView加载的每一个列表项所对应的布局文件);
arryAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,data);
//3.视图(ListView)加载适配器
listView.setAdapter(arryAdapter);
}
}
ListView滑动变黑问题:
Listview默认背景是和系统窗口一样的透明色(#FF191919),如果改变ListView的背景颜色或者背景图片,ListView列表中的View在滚动重新绘制View时仍然使用默认系统窗口的颜色,就会出现滑动变黑的现象。
解决方案:
java:在java文件中,listView.setCacheColorHint(0),颜色值设置为0
xml:android:cacheColorHint="#00000000"--->解决重绘View,ListView背景颜色变黑
android:listSelector="#00000000"--->解决点击item,ListView背景颜色变黑
ListView分割线不显示:android:footerDividersEnable="false"
ListView分割线颜色和宽度:android:divier和android:dividerHeight
SimpleAdapter:
(1)新建一个数据适配器:new SimpleAdapter(context, data, resource, from, to);
/**
*context:上下文
*data:数据源(List<? extends Map<String,?>> data),一个Map所组成的List集合,每一个Map都会去对应*ListView列表中的一行,每一个Map(键-值对)中的键必须包含所用在from中所指定的键
*resource:列表项的布局文件的ID
*from:Map中的键名
*to:绑定数据视图中的ID,与form成对应关系
**/
(2)适配器加载数据源:
(3)视图(ListView)加载适配器:listview.setAdapter(adapter);
代码:view_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
package com.example.listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class Main extends Activity {
private ListView listView;
private SimpleAdapter simAdapter;
private List<Map<String,Object>>datalist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.lv);
//1.新建一个数据适配器,ArrayAdapter(上下文,当前ListView加载的每一个列表项所对应的布局文件);
//2.适配器加载数据源 getData();
datalist=new ArrayList<Map<String,Object>>();
simAdapter=new SimpleAdapter(this, getData(), R.layout.view_item, new String[]{"image","text"}, new int[]{R.id.iv,R.id.tv});
//3.视图(ListView)加载适配器
listView.setAdapter(simAdapter);
}
private List<Map<String,Object>> getData(){
for(int i=0;i<100;i++){
Map<String,Object> map =new HashMap<String, Object>();
map.put("image", R.drawable.ic_launcher);
map.put("text", "zmj"+i);
datalist.add(map);
}
return datalist;
}
}
package com.example.listview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class Main extends Activity implements OnItemClickListener,OnScrollListener {
private ListView listView;
private SimpleAdapter simAdapter;
private List<Map<String,Object>>datalist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.lv);
//1.新建一个数据适配器,ArrayAdapter(上下文,当前ListView加载的每一个列表项所对应的布局文件);
//2.适配器加载数据源 getData();
datalist=new ArrayList<Map<String,Object>>();
simAdapter=new SimpleAdapter(this, getData(), R.layout.view_item, new String[]{"image","text"}, new int[]{R.id.iv,R.id.tv});
//3.视图(ListView)加载适配器
listView.setAdapter(simAdapter);
listView.setOnItemClickListener(this);
listView.setOnScrollListener(this);
}
private List<Map<String,Object>> getData(){
for(int i=0;i<10;i++){
Map<String,Object> map =new HashMap<String, Object>();
map.put("image", R.drawable.ic_launcher);
map.put("text", "zmj"+i);
datalist.add(map);
}
return datalist;
}
/**
* 09-22 06:04:57.075: I/Main(577): 手指没有离开屏幕,视图正在滑动--->SCROLL_STATE_TOUCH_SCROLL
* 09-22 06:04:57.484: I/Main(577): 用户在手指离开屏幕之前,由于用力滑了一下,视图仍然通过惯性滑动--SCROLL_STATE_FLING
* 09-22 06:04:57.844: I/Main(577): 视图已经停止滑动--->SCROLL_STATE_IDLE
*
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_FLING:
Log.i("Main", "用户在手指离开屏幕之前,由于用力滑了一下,视图仍然通过惯性滑动");
Map<String,Object> map =new HashMap<String, Object>();
map.put("image", R.drawable.ic_launcher);
map.put("text", "增加");
datalist.add(map);
/* 直接运行会出现异常提示,没有更新Adapter
* E/AndroidRuntime(610): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.
* Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.
*
*/
simAdapter.notifyDataSetChanged();
break;
case SCROLL_STATE_IDLE:
Log.i("Main", "视图已经停止滑动");
break;
case SCROLL_STATE_TOUCH_SCROLL:
Log.i("Main", "手指没有离开屏幕,视图正在滑动");
break;
default:
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String str=listView.getItemAtPosition(position)+"";
Toast.makeText(this, "position="+position+" text="+str, Toast.LENGTH_SHORT).show();
}
}
注意事项: