一、ListView是安卓中应用非常广泛的一个控件:
1.listView显示适配器有三个步骤:
①.获得控件ListView
②.适配器adapter
③.ListView关联Adapter
一个最简单的适配器只需要几行代码就能搞定:
public class MainActivity extends ListActivity {
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
//数组适配器
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,new String[]{"1","2","3","4","5"});
//关联适配器,因为MainActivity继承ListActivity,ListActivity自带一个listView
setListAdapter(adapter);
}
}
显示效果为:
*如果activity继承了ListActivity则不需要获得控件,因为其本身自带ListView
*ListView还可以代码创建出来:ListView lsv=new ListView(this);
2.ListView适配器:
①ArrayAdapter数组适配器,可将数组显示在listView上
ArrayAdapter<String>adapter2=newArrayAdapter<String>(context,textViewResourceId,objects)
ArrayAdapter<String>adapter2=newArrayAdapter<String>(context,int Resource,textViewResourceId,objects)
各参数所代表的含义:
Context:指向的activity对象就是Context(资源访问对象)
resource:listView中的一个item对应的资源文件
textViewResourceId : resource中的控件id
objects: 数据集合,可以是List集合或数组
例如:
ArrayAdapter<String>adapter=newArrayAdapter<String>(this,R,layout.item_textview_1,newString[]{"1","2"});
②SimpleAdapter简单适配器,可将ListView上List<Map<K, V>>键值对集合显示在
SimpleAdapter(context, data, resource, from, to)
各参数所代表的含义:
data:ListView中要显示的数据
from: date中map对应的key
to:显示到的item中的对应的view上
例如:
SimpleAdapter adapter=newSimpleAdapter(this,data,R.layout.list_item_2,newString[]{"contentKey","dateKey"},new int[]{R.id.textView1,R.id.textView2});
*List<Map<String,Object>>放入数据的方法:
①List<Map<String,Object>> list=newArrayList<Map<String,Object>>();
②Map<String,Object> map=new HashMap<String, Object>();
③map.put("contentKey", "Content"+i);
map.put("dateKey",System.currentTimeMillis());
④list.add(map);
3.SimpleCursorAdapter简单查询适配器,将查询结果显示到ListView上
SimpleCursorAdapter(context, layout, c, from, to, flags)
各参数所代表的含义:
layout:布局文件
c :Cursor对象查询到的结果
from、to和SimpleAdapter一样
flags是一个标识,标识当数据改变调用onContentChanged()的时候,是否通知ContentProvider数据的改变
例如:
SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.list_item_2, cursor, new String[]{"_content"}, newint[]{R.id.input01},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
4.自定义适配器,即自写类继承BaseAdapter,重写BaseAdapter方法,注意getView中的优化
下面我们实现一个简单的自定义适配器,如下图所示:
先看Activity代码MainActivity.java:
<span style="font-size:18px;">package com.example.listView;
import java.util.ArrayList;
import java.util.List;
import com.example.ListView.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//假设此数据来自于数据库
List<Contact> list=new ArrayList<Contact>();
list.add(new Contact("小明", "电话:110", R.drawable.png_01));
list.add(new Contact("小红", "电话:120", R.drawable.png_02));
list.add(new Contact("小丽", "电话:119", R.drawable.png_03));
//要求:将此数据显示在ListView中
ContactAdapter adapter=//继承BaseAdapter
new ContactAdapter(this,
R.layout.list_item_3,list);
//ListView
ListView lsv=(ListView)findViewById(R.id.lsvId);
//关联adapter
lsv.setAdapter(adapter);
}
}</span>
<span style="font-size:18px;">package com.example.listView;
/**借助此类的对象封装联系人信息*/
public class Contact {//VO (Value Object)
/**联系人的名字*/
private String name;
/**联系人手机号*/
private String phone;
/**联系人头像*/
private int photo;
/**通过构造方法对属性初始化*/
public Contact(String name,String phone,int photo){
this.name=name;
this.phone=phone;
this.photo=photo;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
public int getPhoto() {
return photo;
}
}
</span>
一个适配器ContactAdapter.java
<span style="font-size:18px;">package com.example.listView;
import java.util.List;
import com.example.listView.R;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**自定义适配器:负责加载联系人信息构建item*/
public class ContactAdapter extends BaseAdapter{
/**资源访问对象*/
private Context context;
/**item 布局资源id(是构建item view的模板)*/
private int resource;
/**ListView中要显示的数据*/
private List<Contact> contacts;
public ContactAdapter(Context context,int resource,List<Contact> contacts) {
this.contacts=contacts;
this.resource=resource;
this.context=context;
}
/**返回数据(item)的个数*/
@Override
public int getCount() {
return contacts.size();
}
/**此方法返回指定位置的item数据*/
@Override
public Object getItem(int position) {
return contacts.get(position);
}
/**返回item postion*/
@Override
public long getItemId(int position) {
return position;
}
/**借助此方法构建item对象(饺子)
* 此方法实现的功能:包饺子
* 每显示一个item此方法就会执行一次
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("TAG", "getView()");
//1.item view
//1.1通过context找到resource对应的xml文件
//1.2借助pull解析xml
//1.3通过反射构建xml元素的对象
View v=View.inflate(context, resource, null);
//2.item data
Contact c=contacts.get(position);
//3.将item data放到item View
ImageView imgView=(ImageView) v.findViewById(R.id.imageView1);
TextView nameTv=(TextView) v.findViewById(R.id.textView1);
TextView phoneTv=(TextView) v.findViewById(R.id.textView2);
imgView.setImageResource(c.getPhoto());
nameTv.setText(c.getName());
phoneTv.setText(c.getPhone());
return v;//(item)
}
}</span>
MainActivity布局:
<span style="font-size:18px;"><ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/lsvId"
android:background="#fff"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</ListView></span>
ListView中list_item_3的布局:
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#fff"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/png_01" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="18dp"
android:layout_toRightOf="@+id/imageView1"
android:text="Large Text"
android:textColor="#000"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:textColor="#000"
android:text="TextView" />
</RelativeLayout></span>
这样一个简单的ListView就搞定啦!
***特殊的ListView:expandableListView可折叠、分组适配器:可显示二维数组
SimpleExpandableListAdapter adapter2 = newSimpleExpandableListAdapter(context, groupData, expandedGroupLayout, collapsedGroupLayout, groupFrom, groupTo, childData, childLayout, childFrom,childTo)
也可以自定义适配器,继承BaseExpandableListAdapter
下面演示一个简单的ExpandableListView的运用,先上效果图:
这里为了方便只用了一个类,MainActiviy.java:
package com.example.expandable;
import com.example.expandable.R;
import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.TextView;
public class MainActivity
extends ExpandableListActivity {
String groups[]={"我的好友","我的家人","我的同事"};
String childs[][]={{"Tom","Nick","Cat"},{"琳琅天上","少校多怪"},{"调皮捣蛋"}};
int imgs[][]={{R.drawable.png_01,R.drawable.png_02,R.drawable.png_03},{R.drawable.png_03,R.drawable.png_04},{R.drawable.png_05}};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
setListAdapter(
new MyAdapter());
//设置第一组默认展开
getExpandableListView().expandGroup(0);
//添加在元素事件
getExpandableListView().setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent,View v,int groupPosition,int childPosition, long id) {
Toast.makeText(MainActivity.this,childs[groupPosition][childPosition],1).show();
return true;
}
});
}
class MyAdapter extends BaseExpandableListAdapter{
@Override
public int getGroupCount() {
return groups.length;
}
@Override
public int getChildrenCount(
int groupPosition) {//groupPosition分组的下标值
return childs[groupPosition].length;
}
/**返回 分组item的数据*/
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return groups[groupPosition];
}
/**返回每个分组中子元素item对应的数据*/
@Override
public Object getChild(int groupPosition,int childPosition) {
// TODO Auto-generated method stub
return childs[groupPosition][childPosition];
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
/**用于判定id的稳定性
* 在刷新时同样的id值是否指向的是相同的数据
* ,假如指向的是相同的则表示是稳定的吗,
* 假如是不同的则表示不稳定。
* */
@Override
public boolean hasStableIds() {
return false;
}
/**组名 */
@Override
public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {
//1.item view
View view=View.inflate(MainActivity.this,android.R.layout.simple_expandable_list_item_1,null);
//2.item data
String groupName=groups[groupPosition];
//3.将item data放到item view上
((TextView)view).setText(groupName);
return view;//item
}
/***分组中的子元素*/
@Override
public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
//1.item view
View view=View.inflate(MainActivity.this,R.layout.list_item_2,null);
//2.item data
String childName=childs[groupPosition][childPosition];
int imgId=imgs[groupPosition][childPosition];
//3.将item data放到item view上
TextView tv=(TextView)view.findViewById(R.id.textView1);
tv.setText(childName);
ImageView imageView=(ImageView)view.findViewById(R.id.imageView1);
imageView.setImageResource(imgId);
return view;//item
}
/**某个元素是否可以被选中或者被点击,
* 假如希望在ExpandableListView中添加点击事件,
* 此方法必须返回为true*/
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}
MianActivity布局文件,activity_main.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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</RelativeLayout>
item布局文件,list_item_2.xml:
<?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:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/imageView1"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
</RelativeLayout>
二、GridView和ListView相似,都需要Adapter显示,只是显示的布局不一样,GridView可以以网格的布局显示
下面我们来显示一个简单的GridView
先看MainActivity代码:
package com.example.gridview;
import java.util.ArrayList;
import java.util.List;
import com.example.gridview.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnItemClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//GridView数据
List<Item> items=new ArrayList<Item>();
//添加数据
items.add(new Item(R.drawable.png_01,"鼠"));
items.add(new Item(R.drawable.png_02,"牛"));
items.add(new Item(R.drawable.png_03,"虎"));
items.add(new Item(R.drawable.png_04,"兔"));
items.add(new Item(R.drawable.png_05,"龙"));
items.add(new Item(R.drawable.png_06,"蛇"));
items.add(new Item(R.drawable.png_01,"鼠"));
items.add(new Item(R.drawable.png_02,"牛"));
items.add(new Item(R.drawable.png_03,"虎"));
items.add(new Item(R.drawable.png_04,"兔"));
items.add(new Item(R.drawable.png_05,"龙"));
items.add(new Item(R.drawable.png_06,"蛇"));
items.add(new Item(R.drawable.png_01,"鼠"));
items.add(new Item(R.drawable.png_02,"牛"));
items.add(new Item(R.drawable.png_03,"虎"));
//初始化GridView
GridView gv=(GridView) findViewById(R.id.gv01);
//构建Adapter
ItemAdapter adapter=new ItemAdapter(this,R.layout.list_item_2, items);
//关联Adapter
gv.setAdapter(adapter);
//添加item点击事件
gv.setOnItemClickListener(this);
}
/***
* GridView点击事件,点击时显示点击的图片
*/
@Override
public void onItemClick(
AdapterView<?> parent,//gridview
View view,int position,long id) {
Item item=(Item)parent.getItemAtPosition(position);
/*Toast.makeText(this,
item.getName(),1).show();*/
Toast t=new Toast(this);
ImageView imageView=new ImageView(this);
imageView.setImageResource(item.getPhoto());
t.setView(imageView);
//弹窗显示时间
t.setDuration(1);
//弹窗显示位置
t.setGravity(Gravity.CENTER, 0, 0);
t.show();
}
}
Adapter代码ItemAdapter:
package com.example.gridview;
import java.util.List;
import com.example.gridview.R;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ItemAdapter extends BaseAdapter{
private List<Item> items;
private Context context;
private int resource;
public ItemAdapter(Context context,int resource,List<Item> items) {
this.items=items;
this.context=context;
this.resource=resource;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return items.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//1.item view
View v=View.inflate(context,resource, null);
//2.item data
Item item=items.get(position);
//3.将item data放到item view上
ImageView iv=(ImageView)v.findViewById(R.id.imageView1);
TextView tv=(TextView)v.findViewById(R.id.textView1);
iv.setImageResource(item.getPhoto());
tv.setText(item.getName());
return v;
}
}
实体类代码Item.java:
package com.example.gridview;
/**借助此类封装GridView中相关item数据*/
public class Item {
private int photo;
private String name;
public Item(int photo, String name) {
super();
this.photo = photo;
this.name = name;
}
public String getName() {
return name;
}
public int getPhoto() {
return photo;
}
}
MainActivity布局activity_main.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"
android:background="#fff"
tools:context=".MainActivity" >
<GridView
android:id="@+id/gv01"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="3"
android:horizontalSpacing="2dp"
android:verticalSpacing="2dp"
android:columnWidth="120dp"
/>
</RelativeLayout>
Item布局list_item_2.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"
android:background="#cfc" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5"
android:src="@drawable/png_01"
android:layout_centerHorizontal="true"/>
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/imageView1"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_centerHorizontal="true"
android:gravity="center"/>
</LinearLayout>
效果图: