Android开发学习进入第二个阶段了,UI
总结一下ListView,
ListView是个ViewGroup控件,可以显示一个控件列,其中显示的控件元素和显示内容通过一个Adapter进行映射。
常用适配器有:
Array
Adapter数组适配器,可以用来显示单条文本
SimpleAdapter 简单适配器,每个item中可以配置显示多个控件,通过map来将每条item需要显示的内容和对应控件绑定
SimpleCursorAdapter,控件需要显示内容直接和数据库数据进行对应
BaseAdapter最基础的数据适配器,更灵活,每条item可以显示更复杂布局,可以有按钮类型控件。
准备工作
定义用来标志item布局中的控件的
ViewHolder
public final class ViewHolder {
public TextView info;
public CheckBox checkBox;
}
还要定义一个
用于映射控件和显示内容的
List<Map>
List<Map<String, Object>> itemDataList=setitemDataList();
接下来,继承BaseAdapter(重写一些方法)写一个MyAdapter
public class MyAdapter extends BaseAdapter {
private List<Map<String, Object>> itemDataList;
private LayoutInflater mInflater;
public MyAdapter(Context context,List<Map<String, Object>> itemDataList) {
this.itemDataList=itemDataList;
this.mInflater = LayoutInflater.from(context);//上层的根布局
}
@Override//用于确定listView的长度,然后调用getView()逐一绘制每一行<
public int getCount() {return itemDataList.size();}
@Override
public Object getItem(int location) {return itemDataList.get(location);}
@Override
public long getItemId(int position) {return position;}
@Override//关键函数,用于绘制ListView中每个item布局
//position表示是第几行,covertView是从item.xml布局文件中inflate来的View,上一层的View,parent
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item, null);
holder.info = (TextView) convertView.findViewById(R.id.info);//用holder绑定
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.info.setText((String) itemDataList.get(position).get("info"));//设置控件对应内容
holder.checkBox.setChecked((boolean) itemDataList.get(position).get("value"));
return convertView;
}
}
使用
MyAdapter adapter = new MyAdapter(this,itemDataList);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override//控件点击事件
public void onItemClick(AdapterView<?> arg0, View view,int position, long arg3) {
ViewHolder holder = (ViewHolder) view.getTag();
itemDataList.get(position).put("value", !(boolean) itemDataList.get(position).get("value"));
//holder.checkBox.setChecked((boolean) itemDataList.get(position).get("value"));//直接对item中的控件进行操作
adapter.notifyDataSetChanged();//更新控件内容控制
} });
如果不要直接控制item里的按钮而是用点击item代替,需要设置item中按钮的一些属性
android:clickable="false"
android:longClickable="false"
android:contextClickable="false"
android:focusable="false"
android:focusableInTouchMode="false"