什么是ListView?
我们来看几个效果图:
这两个都是使用ListView来实现的,ListView就是用来做这个的。
接下来,
用法:
需要:适配器(Adapter)
步骤:1.创建Adapter对象 MyAdapter adapter = new MyAdater(数据源);(具体实现之后再讲)
2.创建ListView对象 ListView lv = (ListView)this.findViewById();
3.设置数据源 lv.setAdapter(adapter);
所有的ListView的复杂功能实现都是靠自定义Adapter(适配器)来实现的,而不是ListView的本身。
一、基本ListView的使用
其实基本的ListView是指基本的Adapter,ListView的用法都一致。
1. 布局t01.XML(展示界面、主界面)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".T01" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="18dp" >
</ListView>
</RelativeLayout>
2.标签文件 t01_item.XML (也就是组成的单元)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#333"
android:textColor="#fff"
android:textSize="20sp"
android:text="初始"
/>
</LinearLayout>
3.自定义Adapter
class MyAdapter extends BaseAdapter implements OnTouchListener {
public boolean delete( int index )
{
String emp = data.remove(index);
this.notifyDataSetChanged();
return emp != null;
}
private ArrayList<String> data = null;
public MyAdapter(ArrayList<String> data) {
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup vg) {
ViewHolder holder = null;
View view = null;
TextView tv = null;
view = View.inflate(T01.this, R.layout.t01_item, null);
tv = (TextView) view.findViewById(R.id.tv);
tv.setText(data.get(position));<span style="color:#990000;">/******/</span>
return view;
}
}
如果要添加事件要在 /******/的地方添加,也就是View返回之前
优化:
优化的步骤就是把弹出去的View重新利用,比如当界面下滑,上方的View被弹出去,这时下方可以利用上方弹出去的View。
不明白的同学要思考:View是所有控件或布局的父,这里实际是指子布局,也就是t01_item.XML
弹出去的View由系统提供。
重造后的getView函数
<span style="white-space:pre"> </span>@Override
public View getView(int position, View convertView, ViewGroup vg) {
<span style="white-space:pre"> </span>ViewHolder holder = null;
<span style="white-space:pre"> </span>View view = null;
<span style="white-space:pre"> </span>TextView tv = null;
<span style="white-space:pre"> </span>view = View.inflate(T01.this, R.layout.t01_item, null);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>if (null == convertView) {
<span style="white-space:pre"> </span>view = View.inflate(T01.this, R.layout.t01_item, null);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>tv = (TextView) view.findViewById(R.id.tv);
<span style="white-space:pre"> </span>holder = new ViewHolder();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>holder.tv = tv;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>view.setTag(holder);
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>view = convertView;
<span style="white-space:pre"> </span>holder = (ViewHolder) view.getTag();
<span style="white-space:pre"> </span>tv = holder.tv;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>view.setOnTouchListener(this);
<span style="white-space:pre"> </span>tv.setText(data.get(position));
<span style="white-space:pre"> </span>return view;
}
ViewHolder类:
class ViewHolder {
public TextView tv = null;
}
就是修改t01_item.XML文件中的布局,例如增加ImageView、Button等等。