`

【android】使用checkedTextView形成自定义ListView(续)

阅读更多
前面的已经介绍了如何将check选中,但是很不尽如人意的是,每次listView都会调用getView方法来刷新页面,所以导致之前选中的check会在调用getView之后会被取消。
通过:http://blog.csdn.net/whucyl/article/details/7341133
上面的提示对部件进行了重写。
使用一个select的方法,监听选中是否,然后加入一个hashmap,用来保存每次用户选中的状态,每次getView的查看此状态即可。
一下是代码:
MyAdapter方法:
package com.duduli.li;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CheckedTextView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class MyAdapter extends SimpleCursorAdapter{
	 private List list = new ArrayList();
	 private HashMap<Integer, Boolean> isSelected = null; 
	 public String s[];
	 private List<Map<String, Object>> data;   
	 private LayoutInflater layoutInflater;   
	 private List<String> delNumber = new ArrayList<String>();
	 @SuppressWarnings("unused")
	 private Context context; 
	 public MyAdapter(Context context, int layout, Cursor c,
				String[] from, int[] to) {  
		 super(context, layout, c, from, to);
	        this.context = context;   
	        this.data = getData();   
	        this.layoutInflater = LayoutInflater.from(context);
	        isSelected = new HashMap<Integer, Boolean>();
	    }  
	 
	 
	 @Override
		public int getCount() {
			// TODO Auto-generated method stub
			return super.getCount();
		}

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

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

		
	@SuppressWarnings("unused")
	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
	
		
		
		
		Compan cp = null;
		if(cp == null){
			cp = new Compan();
			convertView = layoutInflater.inflate(R.layout.list, null);
			cp.id = (TextView) convertView.findViewById(R.id._id);
			cp.ctv =  (CheckedTextView) convertView.findViewById(R.id.checkText);
			
			
			convertView.setTag(cp);
		}else{
			cp = (Compan) convertView.getTag();
		}
		cp.id.setText((CharSequence) data.get(position).get("_id"));
		cp.ctv.setText((CharSequence) data.get(position).get("Number"));
//		[b]此处即为状态保存的方法![/b]
		Boolean b = isSelected.get(position);
		if(null == b){
			b = false;
		}
		
		if (convertView instanceof ViewGroup) {  
            ViewGroup g = (ViewGroup) convertView;  
            for (int i = 0; i < g.getChildCount(); i++) {  
                View v = g.getChildAt(i);  
                if (v instanceof CheckedTextView) {  
                    ((CheckedTextView) v).setChecked(b);  
                    break;  
                }  
            }  
        }  
		
		
		return convertView;
	}
	



	public List<Map<String, Object>> getData() {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

		while (getCursor().moveToNext()) {
			Map<String, Object> map = new HashMap<String, Object>();
			// System.out.println("ID: "+getCursor().getString(0));
			map.put("_id", getCursor().getString(0));
			// System.out.println("NAME: "+getCursor().getString(1));
			map.put("Number", getCursor().getString(1));
			list.add(map);
		}

		return list;
	}
//	选中加入hashmap
	public void select(int postion, boolean isChecked) {  
        isSelected.put(postion, isChecked);  
    } 

}


然后Activity:
package com.duduli.li;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckedTextView;
import android.widget.ListView;

import com.duduli.db.AllowCallDAO;

	/**
	 * This example shows how to use choice mode on a list. This list is 
	 * in CHOICE_MODE_MULTIPLE mode, which means the items behave like
	 * checkboxes.
	 */
	public class CallComingTest2Activity extends ListActivity {
		private CheckedTextView multiple;
	    @Override
	    public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        AllowCallDAO dao = new AllowCallDAO(this);
	        MyAdapter adapter = new MyAdapter(this, R.layout.list, dao.show()
	        		, new String[]{"_id","phonenr"}, new int[]{R.id._id,R.id.checkText});
	        
	        

	        
	        final ListView listView = getListView();
	        
	        listView.setItemsCanFocus(false);
	        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
	        setListAdapter(adapter);

	    
	    }


		@Override
		protected void onListItemClick(ListView l, View v, int position, long id) {
			// TODO Auto-generated method stub
			System.out.println(position);

			
			multiple = (CheckedTextView)v.findViewById(R.id.checkText);
	        if (multiple != null) {  
	        	multiple.toggle();  
	            ((MyAdapter) l.getAdapter()).select(position, multiple.isChecked());  
	        }   
	        
	        
			if(multiple.isChecked()){
//				getListView().getItemAtPosition(position);
				System.out.println("check");
			}else{
				System.out.println("not check");
			}

		}





	}


分享到:
评论
2 楼 duduli 2012-07-18  
yangzhihui_1171 写道
AllowCallDAO,这个类从哪来啊?



package com.duduli.db;

import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;


public class AllowCallDAO {
	private SQLiteDatabase db;
	private DBHelper dbh;
	public AllowCallDAO(Context context){
		dbh = new DBHelper(context);
	}
	
	
	
	
	public void add(String number){
		db = dbh.getWritableDatabase();
		ContentValues cv = new ContentValues();
//		cv.put("phonenr", ac.getPhonenr());
		cv.put("phonenr", number);
		db.insert("allowcall", null, cv);
//		db.close();
	}
	
	
	public Cursor show(){
		db = dbh.getReadableDatabase();
		Cursor cur = db.query("allowcall",null, null, null, null, null, null);
		System.out.println("show get the cursor count is "+cur.getCount());
//		db.close();
		return cur;
	}
	
	public void delete(List list){
		db = dbh.getWritableDatabase();
		for(int i=0; i<list.size(); i++){
			System.out.println("delete id is "+list.get(i));
			db.delete("allowcall", "_id=?", new String[]{(String) list.get(i)});
		}
//		db.close();
	}

	
	public void dbClose(){
		db.close();
		dbh.close();
	}
}
1 楼 yangzhihui_1171 2012-07-05  
AllowCallDAO,这个类从哪来啊?

相关推荐

    android 自定义ListView实现单选

    总结,自定义ListView实现单选是Android开发中常见的需求。通过创建自定义Adapter,处理点击事件,以及优化视图复用,我们可以轻松实现这一功能。同时,自定义ListView也能为开发者提供更大的灵活性,以满足各种复杂...

    自定义ListView

    6. **优化性能**: 自定义ListView时,为了提高性能,我们通常会使用convertView机制。在`getView()`方法中,如果传入的convertView不为空,那么可以复用这个视图,减少视图的创建,提升滑动流畅性。 7. **复选框...

    android自定义可选择ListView

    为了实现选择功能,我们通常会用到CheckedTextView或者自定义的Checkable布局作为ListView的列表项。 1. **自定义Adapter**: 创建一个继承自BaseAdapter的自定义Adapter,重写其四个关键方法:`getCount()`、`...

    android ListView简单示例

    - 若需在ListView项中添加复选框,可以使用CheckedTextView或自定义布局。同时,设置`setChoiceMode()`启用选择模式,如单选(CHOICE_MODE_SINGLE)或多选(CHOICE_MODE_MULTIPLE)。 8. **下拉刷新和上拉加载更多...

    Android-一个简单灵活的CheckedTextView或CheckableTextView

    与CheckedTextView不同,CheckableTextView并不是Android SDK自带的控件,而是开发者自定义的一个类,它可以扩展任何TextView,并添加可选中功能。这样做的好处是灵活性更高,可以根据项目需求定制更多的行为和样式...

    android多选ListView示例

    如果你的ListView项是自定义的View,你可以使用实现`Checkable`接口的子视图,如`CheckedTextView`,这样在选中时会自动处理背景颜色和复选标记。 综上所述,创建一个多选ListView涉及设置ChoiceMode、维护选中状态...

    Android 类似于windows listview的控件

    `FullListView`可能是一个包含上述所有功能的自定义ListView实现,它不仅支持列宽的拖动调整,还能显示和停止运行的程序。这个示例可以帮助开发者更好地理解如何在实际项目中使用和扩展ListView。 总之,Android的...

    Android三级目录,ListView单选

    总之,实现Android三级目录和ListView单选及二级单选涉及到了数据结构、自定义Adapter、事件监听、布局设计等多个Android开发的关键技术。通过这些技术的组合,我们可以创建出一个功能完整且用户体验良好的目录选择...

    Android ListView单选

    在ListView的每一项中,我们可以使用CheckedTextView,它内置了勾选状态的显示。在适配器的getView()方法中,根据当前项是否被选中来设置CheckedTextView的状态: ```java @Override public View getView(int ...

    安卓listview相关相关-androidlistview长按子项动态添加自定义viewTestView.rar

    另外,如果自定义View需要根据用户的选择状态改变显示,可以使用`CheckedTextView`或自定义的Checkable接口。 总的来说,这个示例提供了如何在Android的ListView中实现长按子项添加自定义View的参考。通过学习和...

    android中listview多选demo

    在ListView的每个列表项中使用CheckedTextView,可以方便地实现单个条目的选择状态。 2. **Adapter**:ListView的数据源通常通过Adapter来提供,例如ArrayAdapter或BaseAdapter。在适配器中,我们需要维护一个选中...

    android自定义多选对话框

    在布局文件中,我们可以使用`CheckedTextView`作为列表项,以便显示每个选项并允许用户进行选择。 ```xml &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&gt; &lt;ListView android:id="@+...

    自定义多选listview

    为了提高性能,ListView使用了View的复用机制。在`getView()`方法中,需要正确处理复用的View,确保其显示的数据与当前的数据项匹配。 7. **保存和恢复选择状态** 如果应用需要在旋转屏幕或其他情况下保持选择...

    Android ListView item 选中高亮显示

    虽然题目是关于ListView的,但现代的Android开发中,通常推荐使用RecycleView代替ListView,因为它提供了更多的自定义选项和更好的性能。实现RecycleView的选中高亮效果与ListView类似,只是需要适配的是...

    android listview+checkbox

    而当需要在ListView的每一项中加入可选的复选框(Checkbox)时,我们通常会涉及到`android listview + checkbox`的组合使用。这个组合允许用户对列表中的每一项进行选择,常见于多选操作场景,如设置、过滤器选择等...

    android listview 例子

    这个"android listview 例子"着重展示了ListView在实际应用中的复杂使用方式,特别是如何在一个ListView中包含各种不同的控件,以实现丰富的界面效果。 ListView的工作原理基于Adapter模式,Adapter是连接数据源和...

    操作ListView控件源码

    如果需要在列表项中包含复选框,可以使用CheckedTextView或者自定义布局,并在Adapter中处理复选状态。同时,ListView还支持选择模式,如SINGLE_CHOICE, MULTIPLE_CHOICE等,可以通过`setChoiceMode()`设置。 **6. ...

    [UI]Android列表ListView使用

    【UI】Android列表ListView使用 在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据,通过滚动的方式节省屏幕空间。ListView通过Adapter机制将数据与视图进行绑定,实现数据与界面的分离,提高了...

    listview单选

    实现ListView的单选,我们可以使用CheckedTextView或者自定义适配器来配合CheckedStateTracker类进行操作。下面我们将详细探讨如何实现这一功能。 首先,我们来看看CheckedTextView。CheckedTextView是TextView的...

Global site tag (gtag.js) - Google Analytics