ArrayAdpter
ArrayAdapter通常用于将数组或List集合的多个值包装成多个列表项
ArrayAdapter adapter2 = new ArrayAdapter(context, resource, textViewResourceId, objects)
T是数组的类型,resource至少包括一个View的布局文件
textViewResourceId指的是textView的id号,如果没有该参数代表使用系统android.R.id.text1
Objects是数据源,String[] arr
ArrayAdapter有六种构造方法,如果只是搭配简单的视图,一般使用下面这种构造方法。
常用构造方法:
public ArrayAdapter(Context context, int resource, int
textViewResourceId, T[] objects)
public ArrayAdapter(Context context, int resource, int
textViewResourceId, List<T> objects)
//context代表上下文,一般传入当前Activity
//resource代表布局资源,传入你需要的布局文件,一般直接使用
android.R.layout.simple_list_item_1,这个布局中包含一个TextView
//textViewResourceId代表的是resourece布局中的TextView的Id号,使用系统布局时传入android.R.id.text1
//其中T代表泛型,数组和集合中就是我们的数据
示例图如下:
ublic class MainActivity extends Activity {
AutoCompleteTextView actv;
//数据源
String[] data={"zhangsan","lisi","wangwu","zhaoliu","tianqi","wangba","xiaojiujiu"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//显示空间
actv = (AutoCompleteTextView) findViewById(R.id.actv);
//适配器
// //自定义的
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_actv, R.id.tv,data);
// 所有需要适配器的view
actv.setAdapter(adapter);
// //系统的
// ArrayAdapter<String> adapter = new ArrayAdapter<String(this,android.R.layout.simple_list_item_1, data);
// actv.setAdapter(adapter);
}
}
<!--主xnl-->
<RelativeLayout 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"
tools:context="com.xykj.id05_10_11autocompletetextview.MainActivity" >
<AutoCompleteTextView
android:id="@+id/actv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionThreshold="1"
android:dropDownHeight="50dp"
android:text="输入手机号" />
<!-- android:completionThreshold="1"是输入几个字符会有显示 默认是输入两个 -->
<!-- android:dropDownHeight="20dp"设置这个可以滚动下面的下拉框 -->
</RelativeLayout>
<!--item_actv.xml的设置也就是显示的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:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv"/>
</LinearLayout>
SimpleAdapter
SimpleAdapter是扩展性最好的适配器,可以定义各种你想要的布局
SimpleAdapter必须放一个HashMap
SimpleAdapter中一个方法:
SimpleAdapter adapter1= new SimpleAdapter(context, data, resource, from, to);
data是数据源,resource是指定显示的一个布局
From是HashMap中的数据,to是要显示在View的指定位置的id号,必须做到与HashMap的一一对应
构造方法:
1. SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int
resource, String[] from, int[] to)
2. 参数context:上下文,比如this。关联SimpleAdapter运行的视图上下文
3. 参数data:Map列表,列表要显示的数据,这部分需要自己实现,类型要与上面的一致,每条项
目要与from中指定条目一致
4. 参数resource:ListView单项布局文件的Id,这个布局就是你自定义的布局了,你想显示什
么样子的布局都在这个布局中。这个布局中必须包括了to中定义的控件id
5. 参数 from:一个被添加到Map上关联每一个项目列名称的列表,数组里面是列名称
6. 参数 to:是一个int数组,数组里面的id是自定义布局中各个控件的id,需要与上面的from
对应
例子:
SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,
getData(),
R.layout.main, new String[] { "img", "title", "info" },
new int[] { R.id.img, R.id.title, R.id.info });
private List<Map<String, Object>> getData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Obje
ct>>();
Map<String, Object> map = new HashMap<String, Object>();
//Map中的Key必须与适配器中from数组中相同
//而to中必须和from一一对应
map.put("img", R.drawable.img1);
map.put("title", "first");
map.put("info", "第一个");
list.add(map);
map = new HashMap<String, Object>();
map.put("img", R.drawable.img2);
map.put("title", "second");
map.put("info", "第二个");
list.add(map);
map = new HashMap<String, Object>();
map.put("img", R.drawable.img3);
map.put("title", "third");
map.put("info", "第三个");
list.add(map);
return list;
}
实例图如下:
public class MainActivity extends Activity {
ListView lv;
// 数据源
String[] names = { "范冰冰", "李晨", "王宝强" };
String[] contents = {
"简介:范冰冰,1981年9月16日生于山东青岛,华语影视女演员、歌手、制片人。1996年参演电视剧《女强人》。1998年主演电视剧《还珠格格》系列成名,2001年起投身大银幕。",
"简介:李晨,1978年11月24日出生于北京市,中国内地影视男演员、监制、赛车手,毕业于北京群星艺术学院。",
"王宝强,1984年5月29日出生于河北省邢台市,中国内地男演员、导演。王宝强6岁开始练习武术,8岁在嵩山少林寺做俗家弟子。2003年,凭借剧情片《盲井》获得第40届台湾电影金马奖最佳新演员奖[1-2] 。2004年,因参演冯小刚执导的剧情片《天下无贼》而获得关注。" };
int[] ids = { R.drawable.fbb, R.drawable.lichen, R.drawable.wangbaoqiang };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// GridView spinner = new GridView(this);
// spinner.setNumColumns(2);
// setContentView(spinner);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
// 创建适配器
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
// android.R.layout.simple_list_item_1, data);
List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
// 添加数据
// list是指你有多少个条目.
for (int i = 0; i < 3; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("img", ids[i]); // R.id.img
map.put("name", names[i]);// R.id.name
map.put("content", contents[i]);// R.id.content
data.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, data,
R.layout.item_lv_star,
new String[] { "img", "name", "content" }, new int[] {
R.id.img, R.id.name, R.id.content });
// spinner.setAdapter(adapter);
lv.setAdapter(adapter);
}
}
主布局
<RelativeLayout 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"
tools:context="com.xykj.id05_10_11.listsimpleaapter.MainActivity" >
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lv"
></ListView>
</RelativeLayout>
显示页面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:id="@+id/img"
android:src="@drawable/ic_launcher"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_toRightOf="@id/img"
android:padding="10dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:text="名字"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/content"
android:text="简介"/>
</LinearLayout>
</RelativeLayout>
BaseAdapter
重写四个方法:
getCount() View显示的个数
getItem(int position)某一条数据
getItemId(int position)这条数据的id也就是position
getView(int position, View convertView, ViewGroup parent)返回布局
布局重用
class ViewHolder
{
创建视图上的所有需要修改的组件
public ViewHolder(View convertView)
{
组件convertView.findViewByID
// convertView.setTag(this);
}
}
getView()
{
ViewHolder holder;
if(convertView == null)
{
//如果为空,代表 一屏没有加载完毕
加载布局
一般使用VconvertView = View.inflater(上下文,布局id,null);
//导入布局后 加载视图的组件
holder = new ViewHolder(convertView);
//设置到布局中
convertView.setTag(holder);
}else
{
//重用的布局 代表已经加载了一屏
holder= (ViewHolder)convertView.getTag();
}
//开始设置组件上面的具体内容
T t = list.get(position);
holder.tv.setText(t.getName());
return convertView;
}
示例图如下:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
// 适配器
List<String> list = new ArrayList<String>();
final List<Article> list2 = new ArrayList<MainActivity.Article>();
for (int i = 0; i < 100; i++) {
list.add("条目" + i);
list2.add(new Article("标题" + i, "内容" + i));
}
// MyBaseAdapter adapter = new MyBaseAdapter(this, list);
final MyBaseAdapter2 adapter = new MyBaseAdapter2(this, list2);
lv.setAdapter(adapter);
// ListView的点击事件
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// postion代表点的第几个
Article a = list2.get(position);
Toast.makeText(getBaseContext(), a.toString(),
Toast.LENGTH_SHORT).show();
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 一般长按事件用来做 删除和弹出对话框
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
list2.remove(position);
// 调用adapter.notifyDataSetChanged方法来刷新适配器,保证数据改变之后,view刷新
// 长度不一致会导致崩溃
// 类容发生改变不会
// Article a = list2.get(position);
// a.content = "哈哈,修改了";
// 必须在主线程
adapter.notifyDataSetChanged();
return true;
}
});
}
public static class Article {
String title;
String content;
@Override
public String toString() {
return "Article [title=" + title + ", content=" + content + "]";
}
public Article(String title, String content) {
super();
this.title = title;
this.content = content;
}
}
}
//简单点的一个适配器
public class MyBaseAdapter extends BaseAdapter {
private List<String> list;
private Context context;
// 数据源
public MyBaseAdapter(Context context, List<String> list) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
// 获取多少条
Log.e("TAG", list.size() + "--------------getConut");
return list.size();
}
@Override
public String getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
// 最重要的方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.e("TAG", position + "--------------getView");
// position 代表当前的第几项
// convertView布局重用
// parent父布局
// 一切与布局相关的初始化都需要上下文
// 只有一个组件的时候可能看不出卡
// TextView tv = new TextView(context);
// // 设置数据
// tv.setText(getItem(position));
// Log.e("TAG", "---" + (convertView == null));
// 布局重用的固定写法
if (convertView == null) {
convertView = new TextView(context);
// 口袋
convertView.setTag(position);
}
TextView tv = (TextView) convertView;
tv.setText(getItem(position));
Log.e("TAG", tv.getTag().toString());
return tv;
}
}
//复杂一些的适配器
public class MyBaseAdapter2 extends BaseAdapter {
private Context context;
private List<Article> list;
public MyBaseAdapter2(Context context, List<Article> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list == null ? 0 : list.size();
}
@Override
public Article getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.item_layout, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.setData(list.get(position));
return convertView;
}
// 对于一个较复杂的布局,组件比较多
class ViewHolder// 保存的是所有的布局上的组件
{
TextView title;
TextView content;
public ViewHolder(View convertView) {
title = (TextView) convertView.findViewById(R.id.tv1);
content = (TextView) convertView.findViewById(R.id.tv2);
// convertView.setTag(this);
}
public void setData(Article a) {
title.setText(a.title);
content.setText(a.content);
}
}
// @Override
// public View getView(int position, View convertView, ViewGroup parent) {
// // 加载布局,考虑布局重用
// if (convertView == null) {
// // View的静态方法 加载视图
// convertView = View.inflate(context, R.layout.item_layout, null);
// }
// // 从一个View中获取他里面的子控件
// TextView title = (TextView) convertView.findViewById(R.id.tv1);
// TextView content = (TextView) convertView.findViewById(R.id.tv2);
// title.setText(list.get(position).title);
// content.setText(list.get(position).content);
// // 一定要注意
// return convertView;
// }
}
//主xml
<RelativeLayout 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"
tools:context="com.example.lesson7_baseadapter.MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
//显示的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="vertical" >
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="内容" />
</LinearLayout>