实现在ListView的每一条List中带图片和CheckBox。

(1)第一步,先上布局文件:main.xml和list.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="vertical" >    <TextView        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="@string/hello" />    <ListView         android:id="@+id/lv"        android:layout_width="fill_parent"        android:layout_height="wrap_content"/></LinearLayout>

list.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" >    <ImageView         android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"/>    <TextView         android:id="@+id/title"        android:textSize="18dip"         android:layout_weight="1"            android:layout_width="wrap_content"        android:layout_height="wrap_content"/>    <CheckBox         android:id="@+id/cb"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:focusable="false"        android:focusableInTouchMode="false"        android:clickable="false"        android:checkMark="?android:attr/listChoiceIndicatorMultiple"/></LinearLayout>

<1>TextView中android:layout_weight="1"
这一句可以使中间的textview权重增大,从而后面的checkbok可以居右显示。

<2>下面三句很重要,如果不加就会出现错误。

由于checkbox的点击事件优先级比listview的高,所以要在checkbox中添加android:focusable="false",使得checkbox初始的时候没有获取焦点。

        android:focusable="false"        android:focusableInTouchMode="false"        android:clickable="false"

(2)为给ListView匹配数据,新建一个MyAdapter类,继承自BaseAdapter。在MyAdapter中实现对数据的绑定,在这个测试中,我把数据写死了。

注意getView方法中对数据的处理。

MyAdapter.java

package com.tgb.ys.test;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.TextView;public class MyAdapter extends BaseAdapter {private LayoutInflater mInflater;private List<Map<String, Object>> mData;public static Map<Integer, Boolean> isSelected;public MyAdapter(Context context) {mInflater = LayoutInflater.from(context);init();}//初始化private void init() {mData = new ArrayList<Map<String,Object>>();for (int i=0; i<5; i++) {Map<String, Object> map = new HashMap<String, Object>();map.put("img", R.drawable.leaf);map.put("title", "第" + (i+1) + "行的标题");mData.add(map);}//定义isSelected这个map是记录每个listItem的状态,初始状态全部为falseisSelected = new HashMap<Integer, Boolean>();for (int i=0; i<mData.size(); i++) {isSelected.put(i, false);}}public int getCount() {// TODO Auto-generated method stubreturn mData.size();}public Object getItem(int position) {// TODO Auto-generated method stubreturn null;}public long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;//convertView为null的时候初始化convertViewif (convertView == null) {holder = new ViewHolder();convertView = mInflater.inflate(R.layout.vlist, null);holder.img = (ImageView)convertView.findViewById(R.id.img);holder.title = (TextView)convertView.findViewById(R.id.title);holder.cBox = (CheckBox)convertView.findViewById(R.id.cb);convertView.setTag(holder);} else {holder = (ViewHolder)convertView.getTag();}holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));holder.title.setText(mData.get(position).get("title").toString());holder.cBox.setChecked(isSelected.get(position));return convertView;}public final class ViewHolder {public ImageView img;public TextView title;public CheckBox cBox;}}

(3)在Activity中调用:

TestCheckBoxActivity.java

package com.tgb.ys.test;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import com.tgb.ys.test.MyAdapter.ViewHolder;/** * 总结: * 1、数据可以在Activity中获取,在初始化Adapter的时候当做参数传递过去,这样就可以是list编程动态的。 * 2、对MyAdapter中getview的理解不够,尤其是convertView.setTag(holder), * @author Administrator */public class TestCheckBoxActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                ListView list = (ListView)findViewById(R.id.lv);        MyAdapter adapter = new MyAdapter(this);        list.setAdapter(adapter);        list.setItemsCanFocus(false);        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);        list.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view, int position,long id) {// TODO Auto-generated method stubViewHolder vHolder = (ViewHolder)view.getTag();//在每次获取点击的item时将对应的checkBox状态改变,同时修改map的值vHolder.cBox.toggle();MyAdapter.isSelected.put(position, vHolder.cBox.isChecked());}});    }}

(4)上结果图:

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android之SQLite——不同数据库间复制表
  4. BlobCache算法详解
  5. Android通过手机GPS获取经纬度方法
  6. Android(安卓)ORMLite数据库框架使用入门
  7. Android根据当前时间获取前面的时间日期,或者之后的时间日期
  8. 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图
  9. Android(安卓)Handler消息机制中的ThreadLocal源码分析

随机推荐

  1. Android系列之网络(三)----使用HttpClient
  2. Android网络常用的请求---HttpURLConnect
  3. Android 加载图片传到另一个页面 关于回
  4. Android 使用URLConnection提交请求
  5. android gallery笔记
  6. android 入门demo Tab选项卡
  7. Android 获取视频缩略图
  8. ubuntu 16.04 编译 android 6.0 错误
  9. android中用socket 接收服务器的消息
  10. Android SqlLiter使用