现在的位置: 首页 > 综合 > 正文

自定义外观的ListView

2013年12月02日 ⁄ 综合 ⁄ 共 2925字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.