2010-03-30 15 views
6

जिसके परिणामस्वरूप मैं एक डेटाबेस से प्रविष्टियों का सुझाव देने 3 AutocompleteTextViews उपयोग कर रहा हूँ से AutocompleteTextView के बारे में जानकारी प्राप्त करें। मैंने ऑटोकॉम्प्लेटेक्स्टव्यू को उप-वर्गीकृत करने के लिए डिफॉल्ट टेक्स्ट को नल पर सेट करने के लिए उप-वर्गीकृत किया और डिफ़ॉल्ट स्थान पर वापस जाने पर सेट किया गया और कुछ भी दर्ज नहीं किया गया।

मैं दृश्य को बाध्य करने के लिए एक सरल कर्सर एडाप्टर का उपयोग कर रहा था, लेकिन मुझे पता चला कि मैं ऑनटैमक्लिक लिस्टनर से AutocompleteTextView की आईडी प्राप्त करने का कोई तरीका नहीं था, जिसे मुझे चयनित पंक्ति से अतिरिक्त चर को एक चर में निर्भर करने की आवश्यकता थी जिस पर AutocompleteTextView यह था से था। मैं बस एक्सेस कर सकता था AutoCompleteTextView $ DropDownListView, जो एक अनियंत्रित आंतरिक वर्ग है जो वास्तविक कार्यक्षमता प्रदान करने के लिए प्रतीत होता है। मूल AutocompleteTextView प्राप्त करने के लिए दृश्य पदानुक्रम को ऊपर जाने का कोई तरीका नहीं था।

इसलिए मैंने SimpleCursorAdapter को उप-वर्गीकृत किया और यह पता लगाने के लिए कि कौन सा AutocompleteTextView एडाप्टर था, पहचानने के लिए एक int जोड़ा, और मैं इसे OnItemClick() में पारित दृश्य से एक्सेस करने में सक्षम था। इसलिए, भले ही मेरी समाधान ठीक काम करता है, मुझे आश्चर्य है कि अगर यह अपनी DropDownListView से एक AutocompleteTextView की आईडी प्राप्त करने के लिए संभव है?

मैं अन्य डेटाबेस क्वेरी का भी उपयोग कर रहा हूं जो आईडीआईटैमक्लिक से आईडी प्राप्त करता है और फिर उस आइटम के लिए डेटा देखता है, क्योंकि मुझे एक से अधिक कॉलम को स्ट्रिंग में परिवर्तित करने का कोई तरीका नहीं मिल सका। क्या मुझे इसके लिए कर्सर एडाप्टर का उपयोग करना चाहिए, एक और क्वेरी शुरू करने के लिए? ओह, और एक और बात, मैं एक डेटाबेस कर्सर आरंभ (all_cursor) जब सब मैं कर रहा हूँ एक नया कर्सर पाने के लिए उस पर फ़िल्टर कर रही है की जरूरत है? ओवरकिल की तरह लगता है।

गतिविधि ....

dbse.openDataBase(); 
    Cursor all_Cursor = dbse.autocomplete_query(); 
    startManagingCursor(all_Cursor); 
    String[] from_all = new String[]{DbAdapter.KEY_NAME}; 
    int[] to_all = new int[] {android.R.id.text1}; 
    from_adapt = new AutocompleteAdapter(FROM_DBADAPTER, this,android.R.layout.simple_dropdown_item_1line, all_Cursor, from_all, to_all); 
    from_adapt.setStringConversionColumn(1); 
    from_adapt.setFilterQueryProvider(this); 
    to_adapt = new AutocompleteAdapter(TO_DBADAPTER, this,android.R.layout.simple_dropdown_item_1line, all_Cursor, from_all, to_all); 
    to_adapt.setStringConversionColumn(1); 
    to_adapt.setFilterQueryProvider(this); 
from_auto_complete = (Autocomplete) findViewById(R.id.entry_from); 
from_auto_complete.setAdapter(from_adapt); 
from_auto_complete.setOnItemClickListener(this); 

to_auto_complete = (Autocomplete) findViewById(R.id.entry_to); 
to_auto_complete.setAdapter(to_adapt); 
to_auto_complete.setOnItemClickListener(this); 

public void onItemClick (AdapterView<?> parent, View view, int position, long id) { 
    Cursor selected_row_cursor = dbse.data_from_id(id); 
    selected_row_cursor.moveToFirst(); 
    String lat = selected_row_cursor.getString(1); 
    String lon = selected_row_cursor.getString(2); 
    int source = ((AutocompleteAdapter) parent.getAdapter()).getSource(); 

स्वत: पूर्ण वर्ग:

public class Autocomplete extends AutoCompleteTextView implements OnTouchListener,OnFocusChangeListener{ 

String textcontent; 
Context mycontext = null; 
int viewid = this.getId(); 

public Autocomplete(Context context, AttributeSet attrs) { 
super(context, attrs); 
textcontent = this.getText().toString(); 
mycontext = context; 
this.setOnFocusChangeListener(this);  
this.setOnTouchListener(this); 
} 
public boolean onTouch(View v, MotionEvent event) { 
if (textcontent.equals(mycontext.getString(R.string.from_textbox)) | 
textcontent.equals(mycontext.getString(R.string.to_textbox)) | 
textcontent.equals(mycontext.getString(R.string.via_textbox))) { 
this.setText(""); 
} 
return false; 
} 
public void onFocusChange(View v, boolean hasFocus) { 
if (hasFocus == false) { 
int a = this.getText().length(); 
if (a == 0){ 
if (viewid == R.id.entry_from) {this.setText(R.string.from_textbox);} 
if (viewid == R.id.entry_to) {this.setText(R.string.to_textbox);} 
if (viewid == R.id.entry_via) {this.setText(R.string.via_textbox);} 
} 
} 
} 
} 

एडाप्टर:

public class AutocompleteAdapter extends SimpleCursorAdapter { 
int source; 
public AutocompleteAdapter(int query_source, Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    source = query_source; 
} 
public int getSource() { 
    return source; 
} 
    } 

खेद है कि कोड का एक बहुत कुछ है! आपकी सहायता के लिए धन्यवाद.

स्टीफन

उत्तर

1

इसके बजाय श्रोता के रूप में this का उपयोग कर के, एक नया श्रोता वर्ग बना सकते हैं और इसे अपने स्वत: पूर्ण TextView दे:

public class MyActivity extends Activity { 

    // .... somewhere 
    from_auto_complete.setOnItemClickListener(new MyClickListener(from_auto_complete)); 

    private class MyClickListener implements OnClickListener { 
     AutoCompleteTextView autoComplete; 
     MyClickListener(AutoCompleteTextView actv) { 
      autoComplete = actv; 
     } 
     // ... handle clicks 
    } 
} 
+0

मुझे इस की समीक्षा करने के लिए थोड़ी देर के लिया है, लेकिन यह काम करता है। ड्रॉपडाउन से सभी रिकॉर्ड विवरण देने के लिए मैंने OnClickListener को OnItemClickListener में बदल दिया। बहुत बहुत धन्यवाद, मुझे पता था कि जवाब होना था! –

संबंधित मुद्दे