ListView 分组

选择地区

FrmLocationSelectFastActivity

package com.reacnnCn.android.activity;

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

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.CharArrayBuffer;
import android.database.Cursor;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;

import com.reacnnCn.android.R;
import com.reacnnCn.android.ReaCnnApplication;
import com.reacnnCn.android.Provider.FirstProviderMetaData;
import com.reacnnCn.android.activity.event.NotifyingAsyncQueryHandler;
import com.reacnnCn.android.activity.event.NotifyingAsyncQueryHandler.NotifyingAsyncQueryListener;
import com.reacnnCn.android.bean.CountryRegion;
import com.reacnnCn.android.config.BaseAppCommon;
import com.reacnnCn.android.config.SharedPreferencesFieldConfig;
import com.reacnnCn.android.utils.LogUtil;
import com.reacnnCn.android.utils.StringUtils;

public class FrmLocationSelectFastActivity extends BaseActivity implements
		NotifyingAsyncQueryListener, OnClickListener, OnItemClickListener {
	private final int Skip_Return = 0;
	private ListView mNormalListView = null;
	private Button BtnReturn = null;
	private com.reacnnCn.android.view.SideBar indexBar;
	private final String TAG = "FrmLocationSelectFastActivity";
	private AudioFilesAdapter mAdapter;
	private NotifyingAsyncQueryHandler mQueryHandler;

	private ImageButton frmselectlocation_Cleanbutton = null;
	private ImageButton frmselectlocation_surebutton = null;
	private ImageButton frmselectlocation_Voicebutton = null;

	/**
	 * 顶部的载入中的布局
	 */
	private LinearLayout topLodingLayout = null;
	private ImageView mtopLoadProgressBar = null;
	private TextView mtopLoadingTextview = null;
	/**
	 * 程序第一次加载
	 */
	private boolean isFristLoading = true;
	boolean isExitEarly = false;
	private AutoCompleteTextView txtSearchKeyText = null;
	private TextView mDialogText;
	private LinearLayout frmselectlocation_selectionall;
	private boolean isVoiceCanVisible = true;
	private final int VOICE_RECOGNITION_REQUEST_CODE = 1234;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		this.setContentView(R.layout.activity_frmproductlocationselect);
		((ReaCnnApplication) this.getApplication())
				.addActivity(FrmLocationSelectFastActivity.this);
		findviewbyid();
		RegisterClick();

		mDialogText = (TextView) findViewById(R.id.fast_position);
		indexBar.setTextView(mDialogText);
		mDialogText.setVisibility(View.INVISIBLE);
		frmselectlocation_Cleanbutton.setVisibility(View.GONE);
		try {
			PackageManager pm = getPackageManager();
			List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
					RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
			if (activities.size() > 0) {
				isVoiceCanVisible = true;
				this.frmselectlocation_Voicebutton.setVisibility(View.VISIBLE);
			} else {
				isVoiceCanVisible = false;
				this.frmselectlocation_Voicebutton.setVisibility(View.GONE);
			}
		} catch (ActivityNotFoundException e) {
			isVoiceCanVisible = false;
			this.frmselectlocation_Voicebutton.setVisibility(View.GONE);
		}
		mNormalListView.setOnItemClickListener(this);
		mAdapter = new AudioFilesAdapter(this, null);
		mNormalListView.setAdapter(mAdapter);
		indexBar.setListView(mNormalListView);
		mQueryHandler = new NotifyingAsyncQueryHandler(getContentResolver(),
				this);
		Loading("", null);
	}

	@Override
	public void onWindowFocusChanged(boolean hasFocus) {
		try {
			AnimationDrawable ad = (AnimationDrawable) mtopLoadProgressBar
					.getBackground();
			ad.start();

		} catch (Exception e) {
		}
		super.onWindowFocusChanged(hasFocus);
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		ListView listView = (ListView) arg0;
		CountryRegion muUserCouponLog = (CountryRegion) listView
				.getItemAtPosition(arg2);
		if (listView != null && muUserCouponLog != null) {
			Intent data = new Intent();
			data.putExtra(
					SharedPreferencesFieldConfig.Skip_LocationSelect_CountryID,
					StringUtils.IntString(muUserCouponLog.getAreaid()));
			data.putExtra(
					SharedPreferencesFieldConfig.Skip_LocationSelect_CountryName,
					muUserCouponLog.getareaname());
			setResult(RESULT_OK, data);
			finish();
		}
	}

	void Loading(String selection, String[] selectionArgs) {
		if (isFristLoading) {
			topLodingLayout.setVisibility(View.VISIBLE);
			mtopLoadProgressBar.setVisibility(View.VISIBLE);
			mtopLoadingTextview.setText(R.string.frmlogin_loading);
			mtopLoadingTextview.setTag("32");
		} else {
			topLodingLayout.setVisibility(View.GONE);
		}
		if (TextUtils.isEmpty(selection)) {
			mQueryHandler.startQuery(FirstProviderMetaData.CONTENT_URI,
					AudioFilesQuery.PROJECTION, AudioFilesQuery.SORT_ORDER);
		} else {
			mQueryHandler.startQuery(FirstProviderMetaData.CONTENT_URI,
					AudioFilesQuery.PROJECTION, selection, selectionArgs,
					AudioFilesQuery.SORT_ORDER);
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == VOICE_RECOGNITION_REQUEST_CODE
				&& resultCode == RESULT_OK) {
			ArrayList<String> matches = data
					.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
			if (matches.size() > 0) {
				String string = matches.get(0);
				LogUtil.i(TAG, "识别为=" + string, BaseAppCommon.Isdebug);
				this.txtSearchKeyText.setText(string);
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	@Override
	protected void onDestroy() {
		mQueryHandler.clearQueryListener();
		super.onDestroy();
	}

	private void findviewbyid() {
		mNormalListView = (ListView) findViewById(R.id.frmselectlocation_RefreshListView);
		BtnReturn = (Button) findViewById(R.id.frmselectlocation_BtnReturn);
		frmselectlocation_Cleanbutton = (ImageButton) findViewById(R.id.frmselectlocation_Cleanbutton);
		frmselectlocation_surebutton = (ImageButton) findViewById(R.id.frmselectlocation_surebutton);
		frmselectlocation_Voicebutton = (ImageButton) findViewById(R.id.frmselectlocation_Voicebutton);

		topLodingLayout = (LinearLayout) findViewById(R.id.loadingfrmselectlocationLayout);
		mtopLoadProgressBar = (ImageView) findViewById(R.id.frmselectlocationfootprogress);
		mtopLoadingTextview = (TextView) findViewById(R.id.frmselectlocationTipMsg);
		txtSearchKeyText = (AutoCompleteTextView) findViewById(R.id.frmselectlocation_searchautotextbox);
		indexBar = (com.reacnnCn.android.view.SideBar) findViewById(R.id.fast_scroller);
		frmselectlocation_selectionall = (LinearLayout) findViewById(R.id.frmselectlocation_selectionall);

	}

	private void RegisterClick() {
		frmselectlocation_Voicebutton.setOnClickListener(this);
		BtnReturn.setOnClickListener(this);
		txtSearchKeyText.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				txtSearchKeyText.requestFocus();
				return false;
			}
		});
		txtSearchKeyText.addTextChangedListener(new TextWatcher() {
			@Override
			public void onTextChanged(CharSequence paramAnonymousCharSequence,
					int start, int before, int count) {

				if (!TextUtils.isEmpty(paramAnonymousCharSequence)) {
					frmselectlocation_Cleanbutton.setVisibility(View.VISIBLE);
					frmselectlocation_Voicebutton.setVisibility(View.GONE);
					frmselectlocation_Cleanbutton
							.setOnClickListener(new View.OnClickListener() {
								@Override
								public void onClick(View v) {
									txtSearchKeyText.setText("");
									if (isVoiceCanVisible) {
										frmselectlocation_Voicebutton
												.setVisibility(View.VISIBLE);
									}
									frmselectlocation_Voicebutton
											.setVisibility(View.GONE);
								}
							});
				} else {
					frmselectlocation_Cleanbutton.setVisibility(View.GONE);
					if (isVoiceCanVisible) {
						frmselectlocation_Voicebutton
								.setVisibility(View.VISIBLE);
					}
					Loading("", null);
				}
			}

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {

			}

			@Override
			public void afterTextChanged(Editable s) {

			}
		});
		frmselectlocation_surebutton.setOnClickListener(this);
		this.mtopLoadingTextview.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				if (mtopLoadingTextview.getTag().toString() == "23") {
					isFristLoading = true;
					Loading("", null);
				} else {
				}
			}
		});
		frmselectlocation_selectionall
				.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						Intent data = new Intent();
						data.putExtra(
								SharedPreferencesFieldConfig.Skip_LocationSelect_CountryID,
								"-1");
						data.putExtra(
								SharedPreferencesFieldConfig.Skip_LocationSelect_CountryName,
								getString(R.string.frmproductlist_location));
						setResult(RESULT_OK, data);
						finish();
					}
				});
	}

	private void SkipIntent(int a) {
		switch (a) {
		case Skip_Return:
			onKeyDown(KeyEvent.KEYCODE_BACK, new KeyEvent(KeyEvent.ACTION_DOWN,
					KeyEvent.KEYCODE_BACK));
			break;
		}
		FrmLocationSelectFastActivity.this.finish();
	}

	@Override
	public void onClick(View arg0) {
		switch (arg0.getId()) {
		case R.id.frmselectlocation_BtnReturn:
			SkipIntent(Skip_Return);
			break;
		case R.id.frmselectlocation_Voicebutton:
			Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
			intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
			intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
					RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
			intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
					getString(R.string.search_speak));
			startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
			break;
		case R.id.frmselectlocation_surebutton:
			String string = this.txtSearchKeyText.getText().toString();
			if (!TextUtils.isEmpty(string)) {
				Loading(FirstProviderMetaData.AreaName + " like ?",
						new String[] { "%" + string + "%" });
			} else {
				//
			}
			break;
		default:
			break;
		}
	}

	@Override
	public String getClassName() {
		return TAG;
	}

	@Override
	protected String getActivityRefresh() {
		return TAG;
	}

	@SuppressWarnings("deprecation")
	@Override
	public void onQueryComplete(int token, Object cookie, Cursor cursor) {
		topLodingLayout.setVisibility(View.GONE);
		if (cursor != null) {
			LogUtil.i(TAG, "count=" + cursor.getCount(), false);
			startManagingCursor(cursor);
		}
		mAdapter.changeCursor(cursor);
	}

	private static class AudioFilesViewHolder {

		LinearLayout alphalayout;
		TextView alphaTextView;
		TextView name;
		public CharArrayBuffer titleBuffer = new CharArrayBuffer(128);
	}

	public class AudioFilesAdapter extends CursorAdapter implements
			SectionIndexer {
		private static final int STATE_UNKNOWN = 0;
		private static final int STATE_SECTIONED_CELL = 1;
		private static final int STATE_REGULAR_CELL = 2;
		private final CharArrayBuffer mBuffer = new CharArrayBuffer(128);
		private int[] mCellStates;

		@SuppressWarnings("deprecation")
		public AudioFilesAdapter(Context context, Cursor cursor) {
			super(context, cursor);
			mCellStates = cursor == null ? null : new int[cursor.getCount()];
		}

		@Override
		public void changeCursor(Cursor cursor) {
			super.changeCursor(cursor);
			mCellStates = cursor == null ? null : new int[cursor.getCount()];
		}

		@Override
		public void bindView(View view, Context context, Cursor cursor) {
			final AudioFilesViewHolder holder = (AudioFilesViewHolder) view
					.getTag();
			boolean needSeparator = false;
			final int position = cursor.getPosition();
			cursor.copyStringToBuffer(AudioFilesQuery.ParentString,
					holder.titleBuffer);
			holder.name.setText(cursor.getString(AudioFilesQuery.AreaName));
			switch (mCellStates[position]) {
			case STATE_SECTIONED_CELL:
				needSeparator = true;
				break;
			case STATE_REGULAR_CELL:
				needSeparator = false;
				break;
			case STATE_UNKNOWN:
			default:
				if (position == 0) {
					needSeparator = true;
				} else {
					cursor.moveToPosition(position - 1);
					cursor.copyStringToBuffer(AudioFilesQuery.ParentString,
							mBuffer);
					if (mBuffer.sizeCopied > 0
							&& holder.titleBuffer.sizeCopied > 0
							&& mBuffer.data[0] != holder.titleBuffer.data[0]) {
						needSeparator = true;
					}
					cursor.moveToPosition(position);
				}
				mCellStates[position] = needSeparator ? STATE_SECTIONED_CELL
						: STATE_REGULAR_CELL;
				break;
			}
			if (needSeparator) {
				holder.alphaTextView.setText(cursor
						.getString(AudioFilesQuery.ParentAlpha)
						+ "\t "
						+ String.valueOf(holder.titleBuffer.data));
				holder.alphalayout.setVisibility(View.VISIBLE);
			} else {
				holder.alphalayout.setVisibility(View.GONE);
			}
		}

		@Override
		public View newView(Context context, Cursor cursor, ViewGroup parent) {
			View convertView = LayoutInflater.from(context).inflate(
					R.layout.layout_item_selectlocation, parent, false);
			AudioFilesViewHolder holder = new AudioFilesViewHolder();
			holder.alphalayout = (LinearLayout) convertView
					.findViewById(R.id.alphalayout);
			holder.name = (TextView) convertView
					.findViewById(R.id.locationname);
			holder.alphaTextView = (TextView) convertView
					.findViewById(R.id.locationalpha);
			convertView.setTag(holder);
			return convertView;
		}

		@Override
		public int getPositionForSection(int section) {
			if (section == '#') {
				return 0;
			} else {
				Cursor c = getCursor();
				for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
					if (c.getString(AudioFilesQuery.ParentAlpha).toUpperCase()
							.charAt(0) == section) {
						return c.getPosition();
					}
				}
			}
			return -1;
		}

		@Override
		public int getSectionForPosition(int position) {
			return 0;
		}

		@Override
		public Object[] getSections() {
			return null;
		}
	}

	private interface AudioFilesQuery {
		String[] PROJECTION = { FirstProviderMetaData._ID,
				FirstProviderMetaData.AreaID, FirstProviderMetaData.AreaName,
				FirstProviderMetaData.AlphaString,
				FirstProviderMetaData.ParentAlpha,
				FirstProviderMetaData.Parentid,
				FirstProviderMetaData.ParentString };
		int AreaName = 2;
		int ParentString = 6;
		int ParentAlpha = 4;
		String SORT_ORDER = "listorder asc";
	}

}



NotifyingAsyncQueryHandler
package com.reacnnCn.android.activity.event;

import java.lang.ref.WeakReference;

import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;

public class NotifyingAsyncQueryHandler extends AsyncQueryHandler {

	private WeakReference<NotifyingAsyncQueryListener> mListener;

	public interface NotifyingAsyncQueryListener {
		void onQueryComplete(int token, Object cookie, Cursor cursor);
	}

	public NotifyingAsyncQueryHandler(ContentResolver resolver,
			NotifyingAsyncQueryListener listener) {
		super(resolver);
		setQueryListener(listener);
	}

	public void setQueryListener(NotifyingAsyncQueryListener listener) {
		mListener = (listener != null) ? new WeakReference<NotifyingAsyncQueryListener>(
				listener) : null;
	}

	public void clearQueryListener() {
		mListener = null;
	}

	public void startQuery(Uri uri, String[] projection) {
		startQuery(-1, null, uri, projection, null, null, null);
	}

	public void startQuery(Uri uri, String[] projection, String sortOrder) {
		startQuery(-1, null, uri, projection, null, null, sortOrder);
	}

	public void startQuery(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		startQuery(-1, null, uri, projection, selection, selectionArgs,
				sortOrder);
	}

	@Override
	protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
		final NotifyingAsyncQueryListener listener = (mListener == null) ? null
				: mListener.get();
		if (listener != null) {
			listener.onQueryComplete(token, cookie, cursor);
		} else if (cursor != null) {
			cursor.close();
		}
	}
}

FirstContentProvider

package com.reacnnCn.android.Provider;

import com.reacnnCn.android.database.DBHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;

public class FirstContentProvider extends ContentProvider {

	public static final UriMatcher uriMatcher;
	public static final int INCOMING_USER_COLLECTION = 1;
	public static final int INCOMING_USER_SIGNAL = 2;
	private DBHelper dh;

	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(FirstProviderMetaData.AUTHORTY,
				FirstProviderMetaData.TABLE_NAME, INCOMING_USER_COLLECTION);
		uriMatcher.addURI(FirstProviderMetaData.AUTHORTY,
				FirstProviderMetaData.TABLE_NAME + "/#", INCOMING_USER_SIGNAL);
	}

	@Override
	public String getType(Uri arg0) {
		switch (uriMatcher.match(arg0)) {
		case INCOMING_USER_COLLECTION:
			return FirstProviderMetaData.CONTENT_TYPE;
		case INCOMING_USER_SIGNAL:
			return FirstProviderMetaData.CONTENT_TYPE_ITEM;
		default:
			throw new IllegalArgumentException("Unknown URI" + arg0);
		}
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		return 0;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = dh.getWritableDatabase();
		long rowId = db.insert(FirstProviderMetaData.TABLE_NAME, null, values);
		if (rowId > 0) {
			Uri insertedUserUri = ContentUris.withAppendedId(
					FirstProviderMetaData.CONTENT_URI, rowId);
			getContext().getContentResolver().notifyChange(insertedUserUri,
					null);
			return insertedUserUri;
		}
		throw new SQLException("Failed to insert row into" + uri);
	}

	@Override
	public boolean onCreate() {
		dh = new DBHelper(getContext());
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		System.out.println("query");
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		qb.setTables(FirstProviderMetaData.TABLE_NAME);
		switch (uriMatcher.match(uri)) {
		case INCOMING_USER_COLLECTION:
			break;
		case INCOMING_USER_SIGNAL:
			qb.appendWhere(FirstProviderMetaData.AreaID + "="
					+ uri.getPathSegments().get(1));
			break;
		}
		SQLiteDatabase db = dh.getWritableDatabase();
		Cursor c = qb.query(db, projection, selection, selectionArgs, null,
				null, sortOrder);
		c.setNotificationUri(getContext().getContentResolver(), uri);
		return c;
	}

}

FirstProviderMetaData

package com.reacnnCn.android.Provider;

import android.net.Uri;
import android.provider.BaseColumns;

public class FirstProviderMetaData implements BaseColumns {
	// 这里的AUTHORTY为包的全名+ContentProvider子类的全名
	public static final String AUTHORTY = "com.reacnnCn.android.Provider.FirstContentProvider";
	// 子表名
	public static final String TABLE_NAME = "CountryRegion";
	// CONTENT_URI为常量Uri; parse是将文本转换成Uri
	public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORTY
			+ "/CountryRegion");
	// 返回ContentProvider中表的数据类型
	public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.CountryRegion";
	// 返回ContentProvider表中item的数据类型
	public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.CountryRegion";

	public static final String ID="_id";
	public static final String AreaID = "areaid";
	public static final String AlphaString = "AlphaString";
	public static final String AreaName = "areaname";
	public static final String ParentAlpha = "parentAlpha";
	public static final String ParentString = "parentString";
	public static final String Parentid = "parentid";

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值