zoukankan      html  css  js  c++  java
  • 自定义外观的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中的<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这些控件,那么点击条目的时候就没有任何反应.


  • 相关阅读:
    android启动模式2
    acvitity的日常 启动模式(上)
    Fragment 切换问题
    异常处理
    Xutils的使用 转载 带自己细细研究
    hibernate 增删改
    OGNL
    JDBC
    Struts 文件的上传与下载
    ActionContext和ServletActionContext小结
  • 原文地址:https://www.cnblogs.com/hanyuan/p/2587314.html
Copyright © 2011-2022 走看看