选择地区
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";
}
}
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";
}