使用自定义的BaseAdapter实现LIstView的展示
实现以下功能点:
1.通过自定义的BaseAdapter展示ListView;
2.动态修改、刷新ListView内容;
3.在自定义的BaseAdapter中实现ListView内容的点击和长按点击事件;
4.在BaseAdapter的getView方法中动态增加新组件;
效果图如下:
xml配置文件1(list_view01.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/editText01Edit" android:layout_width="110sp" android:layout_height="wrap_content" android:text="" /> <Button android:id="@+id/button01Edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="动态修改第1行第2列数据" android:onClick="editPersonAndRefreshListView01" /> </LinearLayout> <ListView android:id="@+id/listView01" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
xml配置文件2(list_view01_item.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/listView01Item01" android:layout_width="50sp" android:layout_height="wrap_content" /> <TextView android:id="@+id/listView01Item02" android:layout_width="90sp" android:layout_height="wrap_content" /> <TextView android:id="@+id/listView01Item03" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
Activity类代码:
package com.zhouzijing.android;
import java.util.ArrayList;
import java.util.List;
import com.zhouzijing.android.util.MenuEntity;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class ListViewDemo extends Activity {
//定义Person
List<Person> persons ;
ListAdapter adapter = null;
ListView listView01 = null;
EditText editTextPersonName = null;
//定义上下文菜单
final private static int CONTEXT_MENU_EDIT = 0;//菜单[编辑]的编号
final private static int CONTEXT_MENU_SHARE = 1;//菜单[分享]的编号
final private static int CONTEXT_MENU_DELETE = 2;//菜单[删除]的编号
final private static int CONTEXT_MENU_CANCEL = 3;//菜单[取消]的编号
private MenuEntity[] contextMenus = {
new MenuEntity(0, CONTEXT_MENU_EDIT, 0, "编辑"),
new MenuEntity(0, CONTEXT_MENU_SHARE, 1, "分享"),
new MenuEntity(0, CONTEXT_MENU_DELETE, 2, "删除"),
new MenuEntity(0, CONTEXT_MENU_CANCEL, 3, "取消"),
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view01);
//获取组件
listView01 = (ListView)findViewById(R.id.listView01);
editTextPersonName = (EditText)findViewById(R.id.editText01Edit);
//显示ListView
initListAllPersons();
showByMyBaseAdapter();
//初始化ListView的事件
//initListView01Event();
}
public void initListAllPersons(){
persons = new ArrayList<Person>();
persons.add(new Person(100,"李小龙","香港",android.R.drawable.ic_delete));
persons.add(new Person(101,"施瓦辛格","美国",android.R.drawable.ic_dialog_alert));
persons.add(new Person(102,"戴安娜王妃","英国",android.R.drawable.ic_dialog_dialer));
persons.add(new Person(103,"成龙","香港",android.R.drawable.ic_dialog_map));
persons.add(new Person(104,"史泰龙","美国",android.R.drawable.ic_lock_idle_alarm));
persons.add(new Person(105,"圣女贞德","法国",android.R.drawable.ic_media_next));
persons.add(new Person(106,"列宁","苏联",android.R.drawable.ic_media_play));
persons.add(new Person(107,"爱迪生","美国",android.R.drawable.ic_menu_add));
persons.add(new Person(108,"孔子","中国",android.R.drawable.ic_media_rew));
persons.add(new Person(109,"杨七郎","宋朝",android.R.drawable.ic_menu_zoom));
persons.add(new Person(110,"秦始皇","秦国",android.R.drawable.ic_menu_agenda));
persons.add(new Person(111,"岳飞","宋朝",android.R.drawable.ic_lock_lock));
}
public void showByMyBaseAdapter(){
adapter = new MyBaseAdapter(this, persons);
listView01.setAdapter(adapter);
}
/**
* 按钮button01Edit的onClick事件.
* @param view
*/
public void editPersonAndRefreshListView01(View view){
//获取TextEdit数据
String value = editTextPersonName.getText().toString();
//更新ListView的内容,并且动态刷新.
persons.get(0).name=value;
((BaseAdapter) adapter).notifyDataSetChanged();
}
/**
* 初始化listView01的事件.
*/
public void initListView01Event(){
//ListView的item点击事件
listView01.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
"[OnItemClickListener]点击了:"+persons.get(position).name,
Toast.LENGTH_SHORT).show();
}
});
//ListView的item长按点击事件
listView01.setOnItemLongClickListener(new OnItemLongClickListener(){
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
"[OnItemLongClickListener]点击了:"+persons.get(position).name,
Toast.LENGTH_SHORT).show();
return false;
}
});
//ListView的键盘选中事件(直接触摸屏幕选中不会激发)
listView01.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(),
"[OnItemSelectedListener:onItemSelected]点击了:"
+persons.get(position).name,
Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
Toast.makeText(getApplicationContext(),
"[OnItemSelectedListener:onNothingSelected]点击了",
Toast.LENGTH_SHORT).show();
}
});
//ListView组件:创建上下文菜单
listView01.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
//获取上下文菜单点击的ListView的位置(position)属性
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
int position = info.position;
//设置上下文菜单标题
menu.setHeaderTitle(persons.get(position).name);
//设置上下文菜单栏目
MenuEntity menuEntity = null;
for(int i=0;i<contextMenus.length;i++){
menuEntity = contextMenus[i];
menu.add(menuEntity.getGroupId(),menuEntity.getItemId()
,menuEntity.getOrder(),menuEntity.getTitle());
}
}
});
}
//监听选择上下文菜单的选择事件
@Override
public boolean onContextItemSelected(MenuItem item) {
//选中的上下文菜单的itemId
int itemId = item.getItemId();
//获取上下文菜单点击的ListView的位置(position)属性
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
int position = info.position;
//Toast
Toast.makeText(getApplicationContext(),
"[onContextItemSelected]点击了"+persons.get(position).name+"" +
",菜单="+contextMenus[itemId].getTitle(),
Toast.LENGTH_SHORT).show();
return true;
}
}
Person类代码
package com.zhouzijing.android;
public class Person {
public int id;
public String name;
public String address;
public int photo;
public Person(int id, String name, String address,int photo) {
super();
this.id = id;
this.name = name;
this.address = address;
this.photo = photo;
}
}
自定义的BaseAdapter类代码
package com.zhouzijing.android;
import java.util.List;
import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MyBaseAdapter extends BaseAdapter {
private List<Person> persons;
Context context;
public MyBaseAdapter(Context context,List<Person> persons){
this.persons = persons;
this.context = context;
}
@Override
public int getCount() {
return (persons==null)?0:persons.size();
}
@Override
public Object getItem(int position) {
return persons.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public class ViewHolder{
TextView textViewItem01;
TextView textViewItem02;
TextView textViewItem03;
ImageView imageView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Person person = (Person)getItem(position);
ViewHolder viewHolder = null;
if(convertView==null){
Log.d("MyBaseAdapter", "新建convertView,position="+position);
convertView = LayoutInflater.from(context).inflate(
R.layout.list_view01_item, null);
viewHolder = new ViewHolder();
viewHolder.textViewItem01 = (TextView)convertView.findViewById(
R.id.listView01Item01);
viewHolder.textViewItem02 = (TextView)convertView.findViewById(
R.id.listView01Item02);
viewHolder.textViewItem03 = (TextView)convertView.findViewById(
R.id.listView01Item03);
//动态增加1个ImageView
viewHolder.imageView = new ImageView(context);
LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
mParams.gravity = Gravity.CENTER;
mParams.width=50;
viewHolder.imageView.setLayoutParams(mParams);
//这个ImageView放到ListView的第2列之后
((LinearLayout)convertView).addView(viewHolder.imageView,2);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
Log.d("MyBaseAdapter", "旧的convertView,position="+position);
}
viewHolder.textViewItem01.setText(String.valueOf(person.id));
viewHolder.textViewItem02.setText(person.name);
viewHolder.textViewItem03.setText(person.address);
viewHolder.imageView.setImageResource(person.photo);
//对ListView中第1个TextView配置OnClick事件
viewHolder.textViewItem01.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(context,
"[textViewItem01.setOnClickListener]点击了"+person.name,
Toast.LENGTH_SHORT).show();
}
});
//对ListView中的每一行信息配置OnClick事件
convertView.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(context,
"[convertView.setOnClickListener]点击了"+person.name,
Toast.LENGTH_SHORT).show();
}
});
//对ListView中的每一行信息配置OnLongClick事件
convertView.setOnLongClickListener(new OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
Toast.makeText(context,
"[convertView.setOnLongClickListener]点击了"+person.name,
Toast.LENGTH_SHORT).show();
return true;
}
});
return convertView;
}
}
MenuEntity类代码:
package com.zhouzijing.android.util;
/**
* 定义菜单实体结构.
* @author stephen
*
*/
public class MenuEntity{
/**
* 生成菜单.
* @param groupId
* @param itemId
* @param order
* @param title
*/
public MenuEntity(int groupId, int itemId, int order, CharSequence title) {
super();
this.groupId = groupId;
this.itemId = itemId;
this.order = order;
this.title = title;
}
/**
* 组.
*/
private int groupId;
/**
* 菜单编号.
*/
private int itemId;
/**
* 显示顺序号.
*/
private int order;
/**
* 菜单显示名称.
*/
private CharSequence title;
/**
* @return the groupId
*/
public int getGroupId() {
return groupId;
}
/**
* @param groupId the groupId to set
*/
public void setGroupId(int groupId) {
this.groupId = groupId;
}
/**
* @return the itemId
*/
public int getItemId() {
return itemId;
}
/**
* @param itemId the itemId to set
*/
public void setItemId(int itemId) {
this.itemId = itemId;
}
/**
* @return the order
*/
public int getOrder() {
return order;
}
/**
* @param order the order to set
*/
public void setOrder(int order) {
this.order = order;
}
/**
* @return the title
*/
public CharSequence getTitle() {
return title;
}
/**
* @param title the title to set
*/
public void setTitle(CharSequence title) {
this.title = title;
}
}