Android中完美解决CheckedTextView选择乱跳问题

XML文件:

checked_layout.xml




    
    


checkitem.xml




    

    


好了,上Java文件

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

import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;

public class TestCheckedTextViewActivity extends Activity{
	private ListView mListView ;
	private List list = new ArrayList() ;
	private ListAdapter adapter ;
	private HashMap isCheckedMap = new HashMap() ;
	
	protected void onCreate(android.os.Bundle savedInstanceState) {
		super.onCreate(savedInstanceState) ;
		setContentView(R.layout.checked_layout) ;
		setUpViews() ;
	}
	private void setUpViews() {
		mListView = (ListView) this.findViewById(R.id.lv_checked) ;
		getData() ;
		adapter = new ListAdapter() ;
		Log.i("TAG", "adapter" + adapter) ;
		mListView.setAdapter(adapter) ;
		//每次点击时判断当前item的选项值,如果处于被选中状态则改变其值,然后刷新ListView
		mListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView arg0, View arg1, int arg2,
					long arg3) {

				if (isCheckedMap.get(arg2)==false) {
					isCheckedMap.put(arg2, true) ;
				} else {
					isCheckedMap.put(arg2, false) ;
				}
				adapter.notifyDataSetChanged() ;
			}
		}) ;
	}
	
	private void getData(){
		for (int i = 0; i < 20; i++) {
			list.add("测试: "+i+"") ;
			//将checkedTextView的多选默认值设为false
			isCheckedMap.put(i, false) ;
		}
	}
	
	private class ListAdapter extends BaseAdapter{
		
		public ListAdapter(){
			
		}
		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int arg0) {
			return null;
		}

		@Override
		public long getItemId(int arg0) {
	
			return 0;
		}

		@Override
		public View getView(int arg0, View arg1, ViewGroup arg2) {
			LayoutInflater inflater = LayoutInflater.from(TestCheckedTextViewActivity.this) ;
			ViewHolder holder = new ViewHolder() ;
			if (arg1 == null) {
				arg1 = inflater.inflate(R.layout.checkitem, null) ;
				holder.checkedTextView = (CheckedTextView) arg1.findViewById(R.id.cbt_test) ;
				holder.imageView = (ImageView) arg1.findViewById(R.id.iv_test) ;
				arg1.setTag(holder) ;
			} else {
				holder = (ViewHolder) arg1.getTag() ;
			}
			holder.checkedTextView.setText(list.get(arg0)) ;
			Log.i("TAG", "isChecked: " + "postion " +arg0 +", "+isCheckedMap.get(arg0)) ;
			holder.checkedTextView.setChecked(isCheckedMap.get(arg0)) ;
			holder.imageView.setImageResource(R.drawable.ic_launcher) ;
			return arg1 ;
		}
	}
	class ViewHolder {
		CheckedTextView checkedTextView ;
		ImageView imageView ;
	}
}


通过Log可以看出,每次选中的对应位置以及状态。而界面上也不会任意跳动。其实,防止乱跳动的重点是不要直接用CheckedTextView来修改列表中Item的状态。

你可能感兴趣的:(android学习笔记)