您的位置:首页 > 移动开发 > Android开发

Android常用控件之ListView(二)

2016-05-30 14:29 726 查看
之前介绍的ListView只能显示文本或者图片,但在实际的应用中显示的内容远不止这些内容,现在我们就来对ListView进行定制,让它显示更加丰富的内容。下面我们来实现显示checkbox选中项的效果。

定制ListView最常用的Adapter还是BaseAdapter,使用它可以实现很多自己定制的列表布局,首先创建一个MyAdapter类继承BaseAdapter,代码如下:

public class MyAdapter extends BaseAdapter{
private LayoutInflater mInflater;
private HashMap<Integer, View> map = new HashMap<Integer, View>();
public List<Map<String, Object>> mdata;
public List<Boolean> mChecked;

public  MyAdapter(Context context) {
// TODO Auto-generated constructor stub
mInflater = LayoutInflater.from(context);
init();
}
private void init() {
// TODO Auto-generated method stub
mdata = new ArrayList<Map<String,Object>>();
for (int i = 0; i < 5; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", i+1+"号控制端");
mdata.add(map);
}
mChecked = new ArrayList<Boolean>();
for (int i = 0; i < 5; i++) {
mChecked.add(false);
}
}
@Override
public int getCount() {
// 在此适配器中所代表的数据集中的条目数,默认为0数据不显示
return mdata.size();
}

@Override
public Object getItem(int position) {
// 获取数据集中与指定索引对应的数据项
return null;
}

@Override
public long getItemId(int position) {
// 取在列表中与指定索引对应的行id
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*
第一个参数position---该视图在适配器数据中的位置 
第二个参数convertView---旧视图 
第三个参数parent: 此视图最终会被附加到的父级视图
*/
ViewHolder holder = null;
if(convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item, null);
holder.title = (TextView) convertView.findViewById(R.id.textView1);
holder.cBox = (CheckBox) convertView.findViewById(R.id.checkBox1);
final int p = position;
//map.put(position, view);
holder.cBox.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v;
mChecked.set(p, cb.isChecked());
}
});
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.cBox.setChecked(mChecked.get(position));
holder.title.setText(mdata.get(position).get("title").toString());
return convertView;
}
public final class ViewHolder{
public TextView title;
public CheckBox cBox;
}
}

BaseAdapter是继承自接口类Adapter,所以继承BaseAdapter要重写getCount(),getItem(),getItemId(),getView(),其中重要的是getView(),这个方法在每个子项被滚动到屏幕内的时候会被调用,方法中的convertView参数,这个参数用于将之前加载好的布局文件进行缓存,以便之后可以进行调用,提高运行效率,当convertView为空创建convertView对象,使用LayoutInflater去加载子项的布局文件,如果不为空就直接对convertView进行重用。其中还用用到了ViewHolder类,用于对控件进行缓存,当convertView为空的时候则创建ViewHolder对象,然后调用findViewById()来获取控件的实例,再调用convertView的setTag()方法,将ViewHolder对象存储在View中。当convertView不为空的时候则调用View的getTag(),把ViewHolder重新取出。在这里还对checkbox设置了点击事件,并记录该子项中的checkbox的状态。

在MainActivity中加载这个适配器,代码如下:

public class MainActivity extends Activity {
private ListView lv;
private Button btn;
private MyAdapter myAdapter;
List<Integer> listItemID = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myAdapter = new MyAdapter(this);
lv = (ListView) findViewById(R.id.listView1);
btn = (Button) findViewById(R.id.btn);
lv.setAdapter(myAdapter);
btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
listItemID.clear();
for (int i = 0; i < myAdapter.mdata.size(); i++) {
if(myAdapter.mChecked.get(i)){
listItemID.add(i);
}
}
if (listItemID.size() == 0) {
AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
builder1.setMessage("没有选中任何记录");
builder1.show();
}else{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < listItemID.size(); i++) {
sb.append("ItemId="+listItemID.get(i)+ ".");
}
Builder builder2 = new AlertDialog.Builder(MainActivity.this);
builder2.setMessage(sb.toString());
builder2.show();
}
}
});
}

}


效果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android