ListView+CheckBox(三)

activity_main.xml()

<FrameLayout 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"
    tools:context="com.harvic.checkableimageview.MainActivity" >

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="100dp"
        android:choiceMode="multipleChoice"
        android:dividerHeight="1px"
        android:scrollbars="none" />

    <Button
        android:id="@+id/all_sel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_marginBottom="50dip"
        android:text="全选" />

    <Button
        android:id="@+id/all_unsel"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:text="全部取消" />

</FrameLayout>

check_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<com.harvic.checkableimageview.CheckableFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="68dp" >

    <com.harvic.checkableimageview.CheckableImageView
        android:layout_gravity="right|center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="10dp"
        android:clickable="false"
        android:src="@drawable/toggle" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="17dp"
        android:layout_marginTop="17dp"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="12sp" />
    </LinearLayout>

</com.harvic.checkableimageview.CheckableFrameLayout>

toggle.xml

<?xml version="1.0" encoding="utf-8"?>

<selector android:constantSize="true" android:variablePadding="false" xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/toggle_on"  android:state_checked="true"/>
    <item android:drawable="@drawable/toggle_off" android:state_checked="false"/>
    <item android:drawable="@drawable/toggle_off"/>
</selector>

DataHolder

package com.harvic.checkableimageview;

public class DataHolder{
	public String titleStr;
	public String subTitleStr;

	public DataHolder(String title,String subTitle){
		titleStr = title;
		subTitleStr = subTitle;
	}
}

CheckableFrameLayout

package com.harvic.checkableimageview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Checkable;
import android.widget.FrameLayout;

public class CheckableFrameLayout extends FrameLayout implements Checkable {

	public CheckableFrameLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	private boolean mChecked = false;

	// @Override
	// public void toggle() {
	// setChecked(!mChecked);
	// }
	//
	// @Override
	// public boolean isChecked() {
	// return mChecked;
	// }

	@Override
	public void setChecked(boolean checked) {
		if (mChecked != checked) {
			mChecked = checked;
			refreshDrawableState();
			for (int i = 0, len = getChildCount(); i < len; i++) {
				View child = getChildAt(i);
				if (child instanceof Checkable) {
					((Checkable) child).setChecked(checked);
				}
			}
		}
	}

	@Override
	public boolean isChecked() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void toggle() {
		// TODO Auto-generated method stub

	}

}

CheckableImageView

package com.harvic.checkableimageview;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.ImageView;

/**
 * extraSpace如果不为0,多余的位置就可以用来放置自定义的状态,使该Drawable具有我们添加的属性 setChecked ->
 * refreshDrawableState ->onCreateDrawableState ->调用selector设置状态
 * 派生自Checkable接口,使CheckableImageView具有的可选中的状态
 * ,但当用户点击选中时,我们感觉会调用selector的state_checked="true"的状态,
 * 但state_checked属性对ImageView是无效的
 * ,因为ImageView并不具有可选中的属性,所以我们在调用selector前,应该为ImageView添加上state_checked属性
 * 这就是重写onCreateDrawableState
 * ()的原因,当用户选中时,给ImageView设置选中状态,强制使它处于选中状态中,这时,它就会调用我们的state_checked属性
 *
 */
public class CheckableImageView extends ImageView implements Checkable {

	public CheckableImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	private boolean mChecked = false;
	// <attr name="state_checked" format="boolean"/>
	private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };

	/**
	 * 返回值:如果extraSpace为0,直接返回控件本身所具有的状态集。如果extraSpace不为0,返回的值除了具有控件本身所具有的状态集,
	 * 会额外分配指定的空间以便用户自主指定状态。
	 */
	@Override
	public int[] onCreateDrawableState(int extraSpace) {
		final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
		if (mChecked) {
			mergeDrawableStates(drawableState, CHECKED_STATE_SET);
		}
		return drawableState;
	}

	@Override
	public void setChecked(boolean checked) {
		if (mChecked != checked) {
			mChecked = checked;
			refreshDrawableState();
		}
	}

	@Override
	public boolean isChecked() {
		return false;
	}

	@Override
	public void toggle() {

	}

//	@Override
//	public boolean isChecked() {
//		return mChecked;
//	}
//
//	@Override
//	public void toggle() {
//		setChecked(!mChecked);
//	}

}

MainActivity

package com.harvic.checkableimageview;

import java.util.ArrayList;
import java.util.List;
import com.example.trylistviewcheckbox.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 构造数据
		final List<DataHolder> dataList = new ArrayList<DataHolder>();
		for (int i = 0; i < 10; i++) {
			dataList.add(new DataHolder("harvic的blog------" + i, "harvic"));
		}
		// 构造Adapter
		ListitemAdapter adapter = new ListitemAdapter(MainActivity.this,
				dataList);
		final ListView listView = (ListView) findViewById(R.id.list);
		listView.setAdapter(adapter);

		// 全部选中按钮的处理
		Button all_sel = (Button) findViewById(R.id.all_sel);
		Button all_unsel = (Button) findViewById(R.id.all_unsel);
		all_sel.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				for (int i = 0; i < dataList.size(); i++) {
					listView.setItemChecked(i, true);
				}
			}
		});

		// 全部取消按钮处理
		all_unsel.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				for (int i = 0; i < dataList.size(); i++) {
					listView.setItemChecked(i, false);
				}
			}
		});
	}

}

ListitemAdapter

package com.harvic.checkableimageview;

import java.util.List;

import com.example.trylistviewcheckbox.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListitemAdapter extends BaseAdapter {

	private List<DataHolder> mList;
	private Context mContext;
	private LayoutInflater mInflater;
	public ListitemAdapter(Context context,List<DataHolder> list){
		mList = list;
		mContext = context;
		mInflater = LayoutInflater.from(context);
	}
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mList.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return mList.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder holder = null;
        if (convertView == null) {  

            holder=new ViewHolder();    

            convertView = mInflater.inflate(R.layout.check_list_item, null);
            holder.mTitle = (TextView)convertView.findViewById(R.id.title);
            holder.mSubTitile = (TextView)convertView.findViewById(R.id.subtitle);
            convertView.setTag(holder);  

        }else {  

            holder = (ViewHolder)convertView.getTag();
        }  

        holder.mTitle.setText((String)mList.get(position).titleStr);
        holder.mSubTitile.setText((String)mList.get(position).subTitleStr);
        return convertView;
	}

	public class ViewHolder{
		public TextView mTitle;
		public TextView mSubTitile;
	};

}
时间: 2024-12-15 07:09:44

ListView+CheckBox(三)的相关文章

ListView+CheckBox两种解决方案及原因分析

最近在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox竟然可以选中(窃喜中),这么简单就搞定了,因为数据量较小,也没有发现什么问题. 后来数据多了, 页面需要滑动了, 发现了一个奇怪的问题,前面明明选中了,而再次滑动回去的时候竟然变成未选中状态! 这是我刚开始写的那段错误的代码: @Override public View getView(int position, View convertView,

android listview级联三菜单选择地区,本地数据库sqlite级联地区,item选中不变色

前言:因为找了N多网上的资源都没有好的解决方案,别人都是只给思路没给具体源码,真TMD纠结,干嘛求别人,自己动手才是真,最痛恨那些所谓大牛的作风,给了点点代码就让别人去想,你让我们这种小白情何于堪!!!!!!此例是基于listview来实现本地sqlite实现的! 二话不说,程序猿求的是有图有真相有源码!大家下载后有什么问题可以找到本人:QQ508181017 核心代码如下 1.数据库操作类 package com.icq.demo.db; import java.util.ArrayList;

ListView+CheckBox两种解决方式及原因分析

近期在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox居然能够选中(窃喜中),这么简单就搞定了,由于数据量较小,也没有发现什么问题. 后来数据多了. 页面须要滑动了, 发现了一个奇怪的问题,前面明明选中了,而再次滑动回去的时候居然变成未选中状态! 这是我刚開始写的那段错误的代码: @Override public View getView(int position, View convertView,

ListView 的三种数据绑定方式

ListView 的三种数据绑定方式 1.最原始的绑定方式: public ObservableCollection<object> ObservableObj; public MainWindow() { InitializeComponent(); ObservableObj = new ObservableCollection<object>(); ObservableObj.Add(new { Name = "帅波", Sex = "男&quo

Android ListView CheckBox状态错乱(转)

转自:http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html listView中包含checkBox的时候,经常会发生其中的checkBox错乱的问题,大多时候的代码如下: 先看一下效果图:奇数行为选中状态,偶数行为非选中状态 具体代码: 布局文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:andro

android listview + checkbox 列表上下滑动导致复选框状态丢失解决办法

以前为这个问题头疼很久.然后去忙其他事情.一直没有去整理,今天好不容易闲下来.就来整整这个listview + checkbox的问题吧 界面: listview_cell: 界面很简单,一个全屏的listview,cell很简单,一个textview一个checkbox activity: package com.example.testlistviewandcheckbox; import java.util.ArrayList; import java.util.List; import

ListView CheckBox 仿百度小说界面UI

不废话,直接上代码 效果图: 主要代码: CheckBean: package baidu.example.ui; public class CheckBean { private int id; private boolean isCheck; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public boolean isCheck() {

求代码:android listview checkbox 从数据库里读取数据后怎么设置相应的checkbox为选中状态

============问题描述============ 现在有一个android listview 带checkbox,从数据库里调取相应数据后,绑定到listview 上. 那么怎么将listview 里的checkbox的选择状态与在数据库中记录一一对应? 求给出代码. 我在自定义BaseAdapter类中,getView方法中无法实现. ============解决方案1============ 这样 你点击的时候 是不是 会获取一个view  通过这个view 获取你那个 checkb

C# winform ListView+CheckBox的做法

1.设置ListView的属性:CheckBoxs=true 2.ListView字段第一列文本框为空,把工具箱里面的CheckBox控件拖到ListView的第一个字段做全选/全不选的控件. 3.CheckBox控件的全选/全不选代码如下: //全选或者全不选 private void chkAll_CheckedChanged(object sender, EventArgs e) { foreach (ListViewItem item in lv.Items) { //item.Sele