自定义外观的ListView

今天看了一下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中的标签里:

<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这些控件,那么点击条目的时候就没有任何反应.

http://blog.csdn.net/caihanyuan/article/details/7408794