自定义外观的ListView

泡在网上的日子 / 文 发表于2012-10-16 22:07 次阅读

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

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

 

收藏 赞 (0) 踩 (0)
上一篇:android中fragment与activity之间通信原理以及例子
首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.jar这个包 然后你写的activity不能再继承自Activity类了,而是要继承android.support.v4.app.FragmentActivity,一些其他的父类也有相应的变化. 由于在android的实现机制中frag
下一篇:Android@id和@+id的区别
Android中的组件需要用一个int类型的值来表示,这个值就是组件标签中的id属性值。 id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc、@+id/xyz等。 如果在@后面使用“+”,表示当修改完某个布局文件并保存后,系统会自动在R.java文件中 生