今天看了一下ArrayAdapter的源代码,发现底层的操作还是要读取XML文件里的标签,然后对应的生成控件。主要是的类是LayoutInflater,在进入到LayoutInflater里面才发现是一些XML的操作。
自定义的外观的ListView最关键就是要写好自己的每一个条目的布局。这些可以自己写一个XML文件,也可以在代码里动态的生成。我是写在XML里面的.
main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:descendantFocusability="blocksDescendants"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:padding="8dp" android:textSize="20dp" /> <Button android:layout_width="80dp" android:layout_height="fill_parent" android:layout_gravity="right" android:padding="5dp" android:text="确定" /> </LinearLayout>
主Activity继承了ListActivity:MyListView:
public class MyListView extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String[] arraytext = getResources().getStringArray(R.array.textarray); setListAdapter(new MyAdapter(this, arraytext)); // setListAdapter(new ArrayAdapter<String>(this, R.layout.main, R.id.text, arraytext)); ListView listView = getListView(); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { System.out.println("choose-------->"); Toast.makeText(MyListView.this, "你选择的ID是:" + (position + 1), Toast.LENGTH_SHORT).show(); } }); } /** * 自定义的ListAdapter */ class MyAdapter extends BaseAdapter { private Object[] array; private Context context; // LayoutInflater用于将XML对应的layout转化为ViewGroup private LayoutInflater inflater; private void init(Context context, Object[] array) { this.context = context; this.array = array; // 得到系统的LayoutInflater this.inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); } public MyAdapter(Context context) { init(context, null); } public MyAdapter(Context context, Object[] array) { init(context, array); } public int getCount() { return array.length; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { View view = null; TextView text = null; if (null == convertView) { view = inflater.inflate(R.layout.main, parent, false); // 得到这个layout里面的TextView控件 text = (TextView) view.findViewById(R.id.text); String textContent = (String) array[position]; text.setText(textContent); } else view = convertView; return view; } } }
其中TextView里面的数据放在了strings.xml中的<string-array>标签里:
<resources> <string name="hello">Hello World, MyListView!</string> <string name="app_name">Myownlistview</string> <string-array name="textarray"> <item>中国</item> <item>美国</item> <item>英国</item> <item>加拿大</item> <item>俄罗斯</item> <item>澳大利亚</item> <item>巴西</item> <item>肯尼亚</item> <item>新西兰</item> <item>法国</item> <item>德国</item> <item>英吉利</item> </string-array> </resources>
程序效果:
这里有个问题,注意main.xml的根节点最后一句android:descendantFocusability="blocksDescendants",
这个是让子节点在默认情况在没有获取焦点。如果没有这一句,
那么这个条目会把焦点默认地付给像Button这些控件,那么点击条目的时候就没有任何反应.