ArrayAdapter
只能显示一行字
SimpleCursorAdapter
数据库相关
SimpleAdapter
可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),
也是只是单纯的负责显示(当然可以设计复杂点的布局来显示复杂列表),例如,每行显示不同背景等。
BaseAdapter
可以实现复杂的列表布局,由于BaseAdapter是一个抽象类,使用该类需要自己写一个适配器继承该类,
正是由于继承了该类,需要我们重写一些方法,让我们可以在代码里控制列表的样式,更加灵活。一般来说只用BaseAdapter
如果只是纯粹显示的话可以用SimpleAdapter
BaseAdapter demo
public class MyBaseAdapter extends BaseAdapter {
private Context mContext;
private List<Map<String, Object>> mData;
private LayoutInflater mInflater;
public static final class ViewHolder {
public ImageView img;
public TextView title;
public TextView info;
public Button viewBtn;
}
public MyBaseAdapter(Context context, List<Map<String, Object>> data) {
mContext = context;
mData = data;
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int arg0) {
return mData.get(arg0);
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.listview_demo3_item, null);
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.info = (TextView) convertView.findViewById(R.id.info);
holder.viewBtn = (Button) convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.img.setBackgroundResource((Integer) mData.get(position).get("img"));
holder.title.setText((String) mData.get(position).get("title"));
holder.info.setText((String) mData.get(position).get("info"));
//给每一个列表后面的按钮添加响应事件
holder.viewBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showInfo();
}
});
return convertView;
}
/**
* listview中点击按键弹出对话框
*/
public void showInfo() {
new AlertDialog.Builder(mContext)
.setTitle("我的listview")
.setMessage("介绍...")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
}
public class ListviewWithBaseAdapterActivity extends ListActivity {
private List<Map<String, Object>> mData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mData = getData();
MyBaseAdapter adapter = new MyBaseAdapter(this, mData);
setListAdapter(adapter);
}
private List<Map<String, Object>> getData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "G1");
map.put("info", "google 1");
map.put("img", R.drawable.room_yixin);
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "G2");
map.put("info", "google 2");
map.put("img", R.drawable.flower);
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "G3");
map.put("info", "google 3");
map.put("img", R.drawable.sky);
list.add(map);
return list;
}
// ListView 中某项被选中后的逻辑
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Log.v("MyListView4-click", (String) mData.get(position).get("title"));
}
}
注意
写getview的时候注意对称,因为有缓存,必须覆盖所有数据,特别注意textView.setBackgroundDrawable(null);
这句话,出了bug我才发现这个,一开始没写导致不该有背景的地方也有了背景(原因是缓存)
if(type==1)
{
textView.setText("1");
textView.setBackgroundResource(R.drawable.sky);
}else if(type==2)
{
textView.setText("2");
textView.setBackgroundDrawable(null);
}
参考资料
http://www.cnblogs.com/playing/archive/2011/03/21/1990555.html
2117

被折叠的 条评论
为什么被折叠?



