SimpleAdapter参数说明:
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
构造函数
参数
context 关联SimpleAdapter运行着的视图的上下文。
data 一个Map的列表。在列表中的每个条目对应列表中的一行,应该包含所有在from中指定的条目
resource 一个定义列表项目的视图布局的资源唯一标识。布局文件将至少应包含哪些在to中定义了的名称。 布局文件
from 一个将被添加到Map上关联每一个项目的列名称的列表
to 应该在参数from显示列的视图。这些应该全是TextView。在列表中最初的N视图是从参数from中最初的N列获取的值。
SimpleAdapter 可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,如果程序的窗口仅仅为了显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无需调用setContentView()来显示某个页面,而是可以直接传入一个Adapter,ListActivity的子类就呈现出一个列表。
构造函数
参数
Context context 这个与 SimpleListItemFactory 相关的 ListView 所处运行上下文(context)。也就是这个 ListView 所在的 Activity。
layout 显示 list item 的 布局文件。这个 layout 文件中至少要包含在 "to" 参数中命名的 views。
c 数据库的光标( Cursor )。如果 cursor 无效,则该参数可以为 null
from 指定 column 中的哪些列的数据将绑定(显示)到 UI 中。如果 cursor 无效, 则该参数可为 null。
to 指定用于显示 "from" 参数指定的数据列表的 views。 这些 views 必须都是 TextViews。 "from" 参数的前 N 个值(valus)和 "to" 参数的前 N 个 views 是一一对应的关系。如果 cursor 无效,则该参数可为 null。
package com.list; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class ListViewActivity extends ListActivity { /** Called when the activity is first created. */ private String[] mListStr = { "ssss", "cccc", "dddddd", "aaaaaa", "ddddddd" }; ListView mList = null; ArrayList<Map<String, Object>> mData = new ArrayList<Map<String, Object>>(); @Override public void onCreate(Bundle savedInstanceState) { mList = getListView(); for (int i = 0; i < mListStr.length; i++) { Map<String, Object> item = new HashMap<String, Object>(); item.put("image", R.drawable.icon); item.put("text", mListStr[i]); mData.add(item); } //new String[] { "image", "text" } 为key,new int[] { R.id.image, //R.id.textView1 } 为对应的控件Id SimpleAdapter adapter = new SimpleAdapter(this, mData, R.layout.item, new String[] { "image", "text" }, new int[] { R.id.image, R.id.textView1 }); mList.setAdapter(adapter); mList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> AdapterView, View View, int position, long Id) { Toast.makeText(ListViewActivity.this, "您选择了标题:" + mListStr[position], Toast.LENGTH_LONG) .show(); } }); super.onCreate(savedInstanceState); // setContentView(R.layout.main); } }
getView工作原理:
实际上Android为你缓存了视图。
Android中有个叫做Recycler的构件,下图是他的工作原理:
通俗的说,inflate就相当于将一个xml中定义的布局找出来.
因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组件.
因此如果你的Activity里如果用到别的layout,比如对话框上的layout,你还要设置对话框上的layout里的组件(像图片ImageView,文字TextView)上的内容,你就必须用inflate()先将对话框上的layout找出来,然后再用这个layout对象去找到它上面的组件,如:
View view = View.inflate(this, R.layout.dialog_layout, null);
TextView dialogTV = (TextView) view.findViewById(R.id.dialog_tv);
dialogTV.setText("abcd");
如果组件R.id.dialog_tv是对话框上的组件,而你直接用this.findViewById(R.id.dialog_tv)肯定会报错.