2010-01-29 5 views
10

używam następujący kod, aby ustawić adapter (SimpleCursorAdapter) dla AutoCompleteTextViewAutoCompleteTextView wyświetla 'android.database.sqlite.SQLiteCursor @' ... po dokonaniu wyboru

mComment = (AutoCompleteTextView) findViewById(R.id.comment); 

    Cursor cComments = myAdapter.getDistinctComments(); 
    scaComments = new SimpleCursorAdapter(this,R.layout.auto_complete_item,cComments,new String[] {DBAdapter.KEY_LOG_COMMENT},new int[]{R.id.text1}); 

    mComment.setAdapter(scaComments); 

auto_complete_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/text1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"/> 

i jes to XML rzeczywistej kontroli

<AutoCompleteTextView 
         android:id="@+id/comment" 
         android:hint="@string/COMMENT" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:textSize="18dp"/> 

, że d ropdown wydaje się działać poprawnie i wyświetla listę elementów. Kiedy dokonuję selekcji z listy, otrzymuję obiekt sqlite ("android.database.sqlite.SQLiteCursor @" ...) w tekście. Ktoś wie, co by to spowodowało lub jak rozwiązać ten problem?

dzięki

Ok jestem w stanie podłączyć do zdarzenia OnItemClick, ale TextView.setText() część widget AutoCompleteTextView jest aktualizowana po tym punkcie. Zdarzenie OnItemSelected() nigdy nie zostanie wywołane, a zdarzenie onNothingSelected() zostanie wywołane, gdy elementy listy rozwijanej zostaną wyświetlone po raz pierwszy.

 mComment.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      // TODO Auto-generated method stub 

      SimpleCursorAdapter sca = (SimpleCursorAdapter) arg0.getAdapter(); 


      String str = getSpinnerSelectedValue(sca,arg2,"comment"); 

      TextView txt = (TextView) arg1; 
      txt.setText(str); 
      Toast.makeText(ctx, "onItemClick", Toast.LENGTH_SHORT).show(); 

     } 

    }); 
    mComment.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 


      Toast.makeText(ctx, "onItemSelected", Toast.LENGTH_SHORT).show(); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
      // TODO Auto-generated method stub 
      Toast.makeText(ctx, "onNothingSelected", Toast.LENGTH_SHORT).show(); 
     } 

    }); 

Ktoś ma jakieś pomysły, jak zastąpić aktualizację TextView?

dzięki

Patrick

Odpowiedz

0

Kiedy dokonać wyboru z listy dostaję sqlite obiekt ('android.database.sqlite.SQLiteCursor @' ... ) w TextView .

Nie mówisz, czym jest ten "widok tekstowy" ani jak odnosi się on do Spinner.

Zamierzam przyjąć wykształcone domysły i założyć, że po prostu przypisujesz wybraną pozycję z Spinner do TextView.

Wybrany element z Spinner przy użyciu SimpleCursorAdapter jest Cursor, wskazując na wiersz wybrany przez użytkownika. Implementacja toString() Cursor da ci coś podobnego do [email protected] w zależności od tego skąd pochodzi Cursor.

Najprawdopodobniej będziesz chciał wywołać getString() na tej Cursor, aby pobrać wartość kolumny i przypisać ją do danego TextView.

+0

Tak, masz rację. Po prostu wybieram jedną z opcji z przędzarki, która jest tworzona jako część AutoCompleteTextView. Gdzie lub jak przechwycić funkcjonalność w celu przetworzenia selekcji; użyj getString() na kursorze, zanim zostanie ustawiony jako tekst kontrolki. Dodam także mój xml. – bugzy

+0

"Gdzie lub jak przechwycić funkcjonalność, aby przetworzyć wybór" - już to robisz. Gdzieś, wywołujesz 'setText()' w TextView. Edytuj ten kod. – CommonsWare

+0

To jest sedno ... nie jestem. Jest to wbudowane zachowanie widżetu AutoCompleteTextView, które wypełnia część TextView widżetu AutoCompleteTextView. – bugzy

9

Nie sądzę, że powinieneś zaktualizować tekst do AutoCompleteTextView. Powinno to zrobić automatycznie. Robi to, wywołując metodę [CursorAdapter.convertToString (...)] [1]. jeśli czytasz opis metody, wskazuje to na to. Jeśli więc pisałeś własny CursorAdapter, zastąpiłbyś tę metodę, aby zwrócić tekst, który chciałbyś pokazać na liście sugestii.Ten facet robi dobrą robotę, wyjaśniając, jak to zrobić:

Linia 86 - http://thinkandroid.wordpress.com/2010/02/08/writing-your-own-autocompletetextview/

Jednakże, ponieważ używasz SimpleCursorAdapter, nie można zastąpić tę metodę. Zamiast tego muszą wdrożyć/stworzyć [SimpleCursorAdapter.CursorToStringConverter] [2], a następnie przekazać je do [SimpleCursorAdapter.setCursorToStringConverter (...)] [3]:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, layout, cursor, from, to); 
CursorToStringConverter converter = new CursorToStringConverter() { 

    @Override 
    public CharSequence convertToString(Cursor cursor) { 
     int desiredColumn = 1; 
     return cursor.getString(desiredColumn); 
    } 
}; 

adapter.setCursorToStringConverter(converter); 

Lub jeśli nie chcesz, aby utworzyć CursorToStringConverter następnie użyj [SimpleCursorAdapter. metoda setStringConversionColumn (...)] [4]. Ale myślę, że trzeba jeszcze jawnie ustawić CursorToStringConverter null:

int desiredColumn = 1; 
adapter.setCursorToStringConverter(null); 
adapter.setStringConversionColumn(desiredColumn); 

Niestety, ale blokowanie spamu nie pozwala mi dodawać linki do Android dokumentacji opisującej linki napisałem powyżej. Ale szybkie wyszukiwanie google wskaże ci prawidłowe strony dokumentu.

3

[Późna odpowiedź, tylko dla zapisu. . Edytowane usunąć moją sugestię, że podklasy jest konieczne]

Aby korzystać SimpleCursorAdapter z AutoCompleteTextView, trzeba ustawić dwie koparki na adapterze: the CursorToStringConverter oraz FilterQueryProvider. Pseudokod następująco:

adapter.setCursorToStringConverter(new CursorToStringConverter() { 
     public String convertToString(android.database.Cursor cursor) { 
      // Assume that "someColumn" contains the strings that we want to 
      // use to identify rows in the result set. 
      final int columnIndex = cursor.getColumnIndexOrThrow("someColumn"); 
      final String str = cursor.getString(columnIndex); 
      return str; 
     } 
    }); 

    adapter.setFilterQueryProvider(new FilterQueryProvider() { 
     public Cursor runQuery(CharSequence constraint) { 
      // runSomeQuery will look for all rows in the database 
      // that match the given constraint. 
      Cursor cursor = runSomeQuery(constraint); 
      return cursor; 
     } 
    }); 
0

Aby rozwiązać ten problem po prostu przedłużony SimpleCursorAdapter i wdrożone metody convertToString(). Następnie utworzyłem instancję i ustawiłem ją jako adapter.

Aby umożliwić filtrowanie w AutoCompleteTextView podczas korzystania z CursorAdapters, użyłem także setFilterQueryProvider(). See this question.

Moja klasa rozszerzony wewnątrz Aktywny wygląda tak:

private static class AutoCompleteCursorAdapter extends SimpleCursorAdapter { 

    public AutoCompleteCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
    } 

    @Override 
    public CharSequence convertToString(Cursor cursor) { 
     // This is the method that does the trick (return the String you need) 
     return cursor.getString(cursor.getColumnIndex("name")); 
    } 
} 
Powiązane problemy