(一)、使用ArrayAdapter做适配器:
常用在:Spinner
①设置数据源
②使用ArrayAdapter做适配器,使用方法同Spinner
③ 给ListView对象设置适配器
String[] arrayData = { "网络设置", "wifi设置", "蓝牙设置", "网络设置2", "wifi设置2","蓝牙设置2", "网络设置3", "wifi设置3", "蓝牙设置3" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
上下文对象: MainActivity.this,
布局地址 : android.R.layout.xxx.theme;
数据源: arrayData);
listView_main_userList.setAdapter(adapter);
listview中每一条item被点击的监听事件
listView_main_userList
.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Object object = parent.getItemAtPosition(position);
System.out.println("==您选择了:==>" + object.toString());
}
});
(二)、使用SimpleAdapter做适配器:
常用在ListView
常用List<Map<String, Object>>接收数据
上下文对象: MainActivity.this, context
数据源: List<Map<String, Object>> data
布局地址 : R.layout.xxx.theme; resourse
Map的key[]: new String[]{""} from
value放在item的位置 new int[]{R.id.xxx} to
数据源
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 10; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", "wxj_" + i);
map.put("password", "123456_" + i);
map.put("email", "[email protected]_" + i);
list.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(
MainActivity.this,
list,
R.layout.listview_main_userlist,
new String[] { "username" },
new int[] {R.id.text_main_username});
listView_main_userlist.setAdapter(adapter);
// 给ListView增加事件监听器。使用OnItemClickListener来监听ListView中每一个Item。
// 可以通过这个监听器,得到被点击的每个item中的内容(该内容其实就是一个map对象)。
listView_main_userlist
.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 借助parent中的getItemAtPosition()方法,传进一个位置参数,
// 就能获取到被点击的那个item的对象。该对象其实就是当初加入适配器中的map对象。
Object object = parent.getItemAtPosition(position);
System.out.println("==您点击了:==>" + object.toString());
}
});
(三)、自定义Adapter :BaseAdapter
常用在:给ListView或GridView设置适配器对象。
class MyAdapter extends BaseAdapter {
public int getCount() {
return imageId.length;
}
public Object getItem(int position) {
return imageId[position];
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = null;
//convertView属于移出到屏幕外的容器
如果convertView被装载,证明将加载新数据,所以可以利用这个容器
if (convertView != null) {
imageView = (ImageView) convertView;}
else{
imageView = new ImageView(MainActivity.this);
}
// setImageResource()方法是设置ImageView对象中的图片
imageView.setImageResource(imageId[position]);
return imageView;
}
(四),较复杂的自定义适配器:
1、新的类:(布局填充器对象)
① LayoutInflater:
from(Context context)
Obtains the LayoutInflater from the given context.
作用是:从当前上下文环境中获得一个布局填充器对象;
View inflate(int resource, ViewGroup root)
Inflate a new view hierarchy from the specified xml resource.
作用是:通过填充一个特定的xml布局文件,形成一个view对象。
② 重写getView()方法。
public View getView(int position, View convertView, ViewGroup parent) {
方法一:
当ListView或GridView中每个item的布局很简单,则无需为item写布局文件
ImageView imageView = null;
if (convertView == null) {
imageView = new ImageView(MainActivity.this);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(imageId[position]);
return imageView;
方法二:
当每个item的布局较复杂的时候,借助LayoutInflater来填充布局文件。
View view = null;
if (convertView == null) {
LayoutInflater是依靠from方法产生的
LayoutInflater mInflater = LayoutInflater.from(context);
调用布局填充器的填充方法,将自定义的item布局文件填充成view对象。
view = mInflater.inflate(R.layout.item_listview_main, null);
依次将item中的控件find出来。注意此时findViewById的对象不是activity对象,
而是每个item中的view对象。因此要view.findViewById()
text_item_username = (TextView) view.findViewById(R.id.textView_item_username);
text_item_password = (TextView) view.findViewById(R.id.textView_item_password);
imageView_item_headpic = (ImageView) view.findViewById(R.id.imageView_item_headpic);
} else {
将移出到屏幕外的view再次利用,也就是充分重复利用convertView
view = convertView;
}
从数据源中一一获取到每个item控件中应该赋予的数值
String username = (String) list.get(position).get("username");
String password = (String) list.get(position).get("password");
int id = imageId[position];
给item中每个控件一一赋值
text_item_username.setText(username);
text_item_password.setText(password);
imageView_item_headpic.setImageResource(id);
return view;
方法三:
当每个item的布局较复杂的时候,借助LayoutInflater来填充布局文件。
利用ViewHolder来包装每个item中的控件。
该方法要再写一个内部类,习惯性大家将其命名为ViewHolder:
class ViewHolder {
public TextView text_item_username;
public TextView text_item_password;
public ImageView imageView_item_headpic;
}
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
LayoutInflater mInflater = LayoutInflater.from(context);
convertView = mInflater.inflate(R.layout.item_listview_main, null);
holder.imageView_item_headpic = (ImageView) convertView .findViewById(R.id.imageView_item_headpic);
holder.text_item_password = (TextView) convertView.findViewById(R.id.textView_item_password);
holder.text_item_username = (TextView) convertView.findViewById(R.id.textView_item_username);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
String username = (String) list.get(position).get("username");
String password = (String) list.get(position).get("password");
int id = imageId[position];
holder.imageView_item_headpic.setImageResource(id);
holder.text_item_username.setText(username);
holder.text_item_password.setText(password);
return convertView;
}
虽然第三种方法有些复杂,但是第二种方法中有个漏洞,