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