如何解决单击自动完成列表
我有一个自动完成功能,可查询数据库。...单击自动完成功能中显示的条目之一时,我想将我单击的项目显示出来...为此,我实现了onClickListener: 这是我的代码:AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autocomplete_from);
ContactListCursorAdapter adapter = new ContactListCursorAdapter(this,cursor);
textView.setAdapter(adapter);
textView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3){
System.out.println(\"Click la autocomplet pe :\" +arg0.getItemAtPosition(arg2).toString());
}
});
但是,这是我的System.out显示的内容:
Click la autocomplet pe :android.database.sqlite.SQLiteCursor@43c33e18
Click la autocomplet pe :android.database.sqlite.SQLiteCursor@43c33e18
任何人都不知道该怎么做,因为这显然对我不起作用!
这是我的整个代码:
我正在做的是将自动完成功能与数据库绑定.....一旦我开始输入自动完成功能,就会显示数据库中2列的内容。...当然,要过滤掉我开始输入的内容:
公共类Server8扩展了MapActivity {
DBAdapter db;
CharSequence约束1;
MapView mapView;
私有MapController mc;
私人ProgressDialog进度;
InitTask init_task = null;
字符串user_id;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.server8);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_from);
progress = new ProgressDialog(this);
progress.setIndeterminate(true);
progress.setMessage(\"I am thinking\");
db = new DBAdapter(this);
db.createDatabase();
db.openDataBase();
Cursor cursor = db.getAllData2();
textView.setHint(\"type route\");
textView.setThreshold(2);
startManagingCursor(cursor);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapView.setStreetView(true);
mapView.setSatellite(true);
mc = mapView.getController();
mc.setZoom(10);
ContactListCursorAdapter adapter = new ContactListCursorAdapter(this,cursor);
textView.setAdapter(adapter);
textView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0,long arg3) {
Cursor c = (Cursor) arg0.getItemAtPosition(arg2);
int nameCol = c.getColumnIndex(db.KEY_ROWID_2);
user_id = c.getString(nameCol);
init_task = new InitTask();
init_task.execute(db);
}
});
Button b=(Button)findViewById(R.id.stop);
b.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg1) {
System.out.println(\"Click pe butonul stop!\");
init_task.cancel(true);
}
});
}
public void theRouteDraw(GeoPoint p) {
mc.animateTo(p);
mc.setZoom(17);
mapView.setSatellite(true);
mapView.setStreetView(true);
mapView.invalidate();
}
class myOverlay extends Overlay {
GeoPoint gp1;
GeoPoint gp2;
public myOverlay(GeoPoint gp1,GeoPoint gp2) {
this.gp1 = gp1;
this.gp2 = gp2;
}
public void draw(Canvas canvas,MapView mapView,boolean shadow) {
Projection projection = mapView.getProjection();
Paint mPaint = new Paint();
Point from = new Point();
projection.toPixels(gp1,from);
mPaint.setColor(Color.BLUE);
Point to = new Point();
projection.toPixels(gp2,to);
mPaint.setStrokeWidth(9);
mPaint.setAlpha(120);
canvas.drawLine(from.x,from.y,to.x,to.y,mPaint);
super.draw(canvas,mapView,shadow);
}
}
public class InitTask extends AsyncTask<DBAdapter,GeoPoint,Void> {
List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>();
DBAdapter db;
int latitude;
int longitude;
GeoPoint p;
String TABLE_3;
protected void onPreExecute() {
progress.show();
}
protected Void doInBackground(DBAdapter... db) {
try {
//db[0].openDataBase();
Cursor c = db[0].getCursor3(db[0].TABLE_3,user_id);
if (c.moveToFirst()) {
do {
longitude = (int) Double.parseDouble(c.getString(1));
latitude = (int) Double.parseDouble(c.getString(2));
System.out.println(\"Valoarea latitudinii\" + latitude
+ longitude);
p = new GeoPoint(longitude,latitude);
publishProgress(p);
Thread.sleep(2500);
} while (c.moveToNext());
}
c.close();
db[0].close();
} catch (Exception e) {
Log.d(\"Eroare\",\"doInBackground\",e);
}
return null;
}
protected void onProgressUpdate(GeoPoint... progress1) {
try {
if (geoPointsArray.size() == 1) {
mapView.getOverlays().add(
new myOverlay(geoPointsArray.get(0),geoPointsArray
.get(0)));
theRouteDraw(progress1[0]);
}
} catch (Exception e) {
e.printStackTrace();
}
if (geoPointsArray.size() > 1) {
int i = geoPointsArray.size();
List overlays = mapView.getOverlays();
overlays.add(new myOverlay(geoPointsArray.get(i - 1),progress1[0]));
theRouteDraw(progress1[0]);
}
geoPointsArray.add(progress1[0]);
}
}
public class ContactListCursorAdapter extends CursorAdapter implements
Filterable {
private Context context;
private TextView mName,mNumber;
public ContactListCursorAdapter(Context context,Cursor cursor) {
super(context,cursor);
this.context = context;
}
@Override
public View newView(Context context,Cursor cursor,ViewGroup parent) {
Cursor c = getCursor();
final LinearLayout ret = new LinearLayout(context);
final LayoutInflater inflater = LayoutInflater.from(context);
mName = (TextView) inflater.inflate(
android.R.layout.simple_dropdown_item_1line,parent,false);
mNumber = (TextView) inflater.inflate(
android.R.layout.simple_dropdown_item_1line,false);
ret.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout horizontal = new LinearLayout(context);
horizontal.setOrientation(LinearLayout.HORIZONTAL);
int nameCol = c.getColumnIndex(db.KEY_SURSA);
String name = c.getString(nameCol);
String number = c.getString(c.getColumnIndex(db.KEY_DATE));
mName.setText(name);
mNumber.setText(number);
horizontal.addView(mName,new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
ret.addView(mNumber,LayoutParams.WRAP_CONTENT));
ret.addView(horizontal,LayoutParams.WRAP_CONTENT));
return ret;
}
@Override
public void bindView(View view,Context context,Cursor cursor) {
int nameCol = cursor.getColumnIndex(db.KEY_SURSA);
String name = cursor.getString(nameCol);
String number = cursor
.getString(cursor.getColumnIndex(db.KEY_DATE));
((TextView) ((LinearLayout) view).getChildAt(0)).setText(number);
LinearLayout horizontal = (LinearLayout) ((LinearLayout) view)
.getChildAt(1);
((TextView) horizontal.getChildAt(0)).setText(name);
}
public CharSequence convertToString(Cursor cursor) {
int numcol = cursor.getColumnIndexOrThrow(db.KEY_SURSA);
String name = cursor.getString(numcol);
return name;
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (getFilterQueryProvider() != null) {
return getFilterQueryProvider().runQuery(constraint);
}
String filter = \"\";
if (constraint == null)
filter = \"\";
else
filter = constraint.toString();
Cursor cursor = db.getCursor(filter);
return cursor;
}
}
public void onDestroy(){
super.onDestroy();
db.close();
}
protected void onPause() {
super.onPause();
if(init_task!=null){
init_task.cancel(true);
init_task=null;
}
}
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
单击后,这就是我的自动填充行为:
textView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0,long arg3) {
Cursor c = (Cursor) arg0.getItemAtPosition(arg2);
int nameCol = c.getColumnIndex(db.KEY_ROWID_2);
user_id = c.getString(nameCol);
init_task = new InitTask();
init_task.execute(db);
}
});
解决方法
@embry此textview的onItemclickListener将返回光标,而不是光标内的项目。
在自定义光标适配器(ContactListCursorAdapter)中,您将实现一个名为covertToString(Cursor)的方法。此方法指示用户单击自动完成列表中的每个条目时显示的内容。在这里可以获取所选的值。
@Override
public String convertToString(Cursor cursor) {
// this method dictates what is shown when the user clicks each entry in your autocomplete list
String name=\"\";
name = cursor.getString(cursor.getColumnIndex(\"column1\"))
Id = cursor.getInt(cursor.getColumnIndex(\"_id\"));
return name;
}
public int getId(){
return Id;
}
我在convertToString()中获得ID。以及用于返回ID的方法getId()。所以在主要方法中
AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autocomplete_from);
ContactListCursorAdapter adapter = new ContactListCursorAdapter(this,cursor);
int Id = adapter.getDrugId();
这对我有用。我不确定这是否是正确的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。