Android中ListView通过BaseAdapter实现数据的绑定

 1. public class ListFiles extends Activity
{
ListView Listview=null;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
super.setContentView(R.layout.files);
Listview=(ListView) super.findViewById(R.id.list);//获取listview控件
//Listview.setItemsCanFocus(false); //设置listview的数据源这里的ListViewAdapter是一个继承自BaseAdapter的类对象,其内容在下面:
ListViewAdapter adapter= new ListViewAdapter(this, serachFile(),R.layout.listview_item_layout,new String[]{"img","title","info","button"}, new int[]{R.id.imageView1,R.id.textView1,R.id.textView2,R.id.imagebutton1}); Listview.setAdapter(adapter);
//this.setContentView(Listview);
//为listview添加事件监听器
Listview.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3)
{
Toast.makeText(ListFiles.this, "你点了第"+(arg2+1)+"项", Toast.LENGTH_LONG).show();
} });
}
//从sdcard中扫描文件
public List<Map<String,Object>> serachFile()
{
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
File file=new File(Environment.getExternalStorageDirectory().toString()+"/RecorderFile");
File[] files=file.listFiles(); for(int i=0;i<files.length;i++)
{
if(files[i].getName().endsWith(".3gp"))
{
Map<String,Object> map=new HashMap<String,Object>();
map.put("img", R.drawable.ic_launcher);
map.put("title", files[i].getName());
map.put("info", files[i].getPath());
map.put("button", R.drawable.control_play_blue);
list.add(map);
}
}
System.out.println("**************"+Environment.getExternalStorageState());
}
return list;
} } 2.继承自BaseAdapter 的 ListViewAdapter类 public class ListViewAdapter extends BaseAdapter
{
private Context myContext;
List<Map<String,Object>> listMap;
LayoutInflater flater;
private int[] ID;
private String[] InforMation;
private int layoutID;
private MediaPlayer Media;
//次构造方法将调用此对象的数据传送过来,并通过声明对象来获取对象
public ListViewAdapter(ListFiles listFiles,List<Map<String, Object>> listMap2, int listviewItemLayout,
String[] strings, int[] is)
{
this.myContext=listFiles;
listMap=listMap2;//存储map的集合,也就是listview的所有数据
layoutID=listviewItemLayout;//listviewItem的布局文件也就是自定义listview中的控件的布局文件
ID=is;
InforMation=strings;
flater=LayoutInflater.from(myContext); }
public int getCount()
{
return listMap.size();
}
public Object getItem(int position)
{
return 0;
}
public long getItemId(int id) {
return id;
} public View getView( int position, View view, ViewGroup parent)
{
view=flater.inflate(layoutID, null)//通过LayoutInflater对象来获取到他的view控件内容 //这个循环是:listview中每一项中的数据控件,通过此方法来进行填充
for (int i = 0; i < InforMation.length; i++)
{//备注1
if (view.findViewById(ID[i]) instanceof ImageView)
{
//这里的instaceof是如果当前找到的控件是ImageView控件的话,获取到他的控件,并设置其数据,而数据就存放到一个string类型的数组里这里是InforMation;其中的控件    的id已经存放到一个整形数组里面(ID);这里不能使ID[position]因为这是设置listview中每一项中的数据,所以要用到ID[i];listMap.get(position)是获取到当前listview中的Item    而不是Item中的数据
ImageView img = (ImageView) view.findViewById(ID[i]);
img.setBackgroundResource((Integer)listMap.get(position).get(InforMation[i])); }
else if (view.findViewById(ID[i]) instanceof TextView)
{
TextView title=(TextView) view.findViewById(ID[i]);
title.setText(listMap.get(position).get(InforMation[i]).toString());
}
else if(view.findViewById(ID[i]) instanceof ImageButton)
{
ImageButton btn=(ImageButton) view.findViewById(ID[i]);
btn.setImageURI(Uri.parse(listMap.get(position).get(InforMation[i]).toString()));
} }
addListener(view,position);
return view;//把数据中的每一项冲送个listview控件 }
private void addListener(View view, final int position) {
view.findViewById(R.id.imagebutton1).setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
showDialog(position);
Toast.makeText(myContext, listMap.get(position).get("info").toString(), Toast.LENGTH_LONG).show();
}
});
} //这个方法是播放当前选中的媒体文件
public void showDialog(int position)
{ try
{
//其中MediaPlayer media=new MediaPlayer()不能这样写(有些情况),否则会报错
Media=MediaPlayer.create(myContext, Uri.parse(listMap.get(position).get("info").toString()));
if(Media!=null)
{
Media.stop();
}
Media.prepare();
Media.start(); Builder dialog=new AlertDialog.Builder(myContext);
dialog.setTitle("温情提示!");
dialog.setMessage("正在播放的是:"+listMap.get(position).get("info").toString());
dialog.setIcon(R.drawable.sound);
dialog.setCancelable(true);
dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which)
{
Media.stop();
//Media.release();
dialog.dismiss();
}
});
dialog.show();
}
catch (Exception e)
{
e.printStackTrace();
} } } 注意:listview是通过自定义的布局文件中的话,如果其中包括button,checkBox等可选择的控件这样会让listview的item失去焦点;可以把button
177     的focusable属性设置为false这样button控件就自动放弃获得焦点,listview中的item就会获得焦点还有一种是:把自定义的的布局文件的根节点设置为:
      android:descendantFocusability="blocksDescendants"这样就可以阻止listview中的控件来获得焦点
上一篇:在java项目中使用log4j的实例


下一篇:[转载]用c写PHP的扩展接口(php5,c++)