2010-01-29 30 views
10

Tôi đang sử dụng đoạn mã sau để thiết lập các bộ chuyển đổi (SimpleCursorAdapter) cho một AutoCompleteTextViewAutoCompleteTextView màn 'android.database.sqlite.SQLiteCursor @' ... sau khi thực hiện lựa chọn

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"/> 

và thi là xml cho sự kiểm soát thực tế

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

các d ropdown xuất hiện để hoạt động chính xác và hiển thị danh sách các mục. Khi tôi thực hiện lựa chọn từ danh sách, tôi nhận được đối tượng sqlite ('android.database.sqlite.SQLiteCursor @' ...) trong chế độ xem văn bản. Bất cứ ai biết điều gì sẽ gây ra điều này, hoặc làm thế nào để giải quyết vấn đề này?

nhờ

Ok tôi có thể móc vào các sự kiện OnItemClick, nhưng TextView.setText() phần widget AutoCompleteTextView được cập nhật sau thời điểm này. Sự kiện OnItemSelected() không bao giờ bị sa thải và sự kiện onNothingSelected() được kích hoạt khi các mục thả xuống được hiển thị lần đầu tiên.

 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(); 
     } 

    }); 

Bất kỳ ai cũng có ý tưởng về cách ghi đè cập nhật TextView?

nhờ

patrick

Trả lời

0

Khi tôi thực hiện một lựa chọn từ danh sách tôi nhận được một đối tượng sqlite ('android.database.sqlite.SQLiteCursor @' ... ) trong TextView .

Bạn không nói "textview" này là gì hoặc cách liên quan đến số Spinner.

Tôi sẽ thực hiện dự đoán có giáo dục và giả định rằng bạn chỉ đơn giản chỉ định mục đã chọn trong số Spinner vào số TextView.

Mục được chọn từ Spinner bằng cách sử dụng SimpleCursorAdapterCursor, trỏ vào hàng mà người dùng đã chọn. Việc thực hiện toString() của Cursor sẽ cung cấp cho bạn một cái gì đó giống như [email protected] tùy thuộc vào nơi mà Cursor đến từ đó.

Nhiều khả năng, bạn sẽ muốn gọi getString() trên số Cursor đó, để truy xuất một số giá trị cột và gán giá trị đó cho số TextView được đề cập.

+0

Vâng, bạn là chính xác. Tôi chỉ đơn giản là chọn một trong các tùy chọn từ spinner được tạo ra như là một phần của AutoCompleteTextView. Ở đâu hoặc làm thế nào để tôi chặn các chức năng để xử lý việc lựa chọn; sử dụng getString() trên con trỏ, trước khi nó được đặt làm văn bản của điều khiển. Tôi cũng sẽ thêm xml của mình. – bugzy

+0

"Ở đâu hoặc làm thế nào để tôi chặn các chức năng để xử lý các lựa chọn" - bạn đã làm điều đó. Ở đâu đó, bạn đang gọi 'setText()' trên TextView. Chỉnh sửa mã đó. – CommonsWare

+0

Đó là vấn đề ... Im không. Nó được xây dựng trong hành vi của các widget AutoCompleteTextView đó là populating phần TextView của widget AutoCompleteTextView. – bugzy

9

Tôi không nghĩ bạn nên cập nhật văn bản cho AutoCompleteTextView. Nó sẽ tự động làm điều đó. Nó thực hiện điều này bằng cách gọi phương thức [CursorAdapter.convertToString (...)] [1]. nếu bạn đọc mô tả của phương pháp nó chỉ ra điều này. Vì vậy, nếu bạn đang viết CursorAdapter của riêng bạn, bạn sẽ ghi đè phương thức đó để trả lại bất kỳ văn bản nào bạn muốn hiển thị trong danh sách các đề xuất.Anh chàng này làm một công việc tốt trong việc giải thích làm thế nào để làm điều đó:

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

Tuy nhiên, kể từ khi bạn đang sử dụng một SimpleCursorAdapter, bạn không thể ghi đè phương pháp này. Thay vào đó bạn cần phải thực hiện/tạo một [SimpleCursorAdapter.CursorToStringConverter] [2] và vượt qua nó vào [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); 

Hoặc nếu bạn không muốn tạo ra một CursorToStringConverter sau đó sử dụng [SimpleCursorAdapter. phương thức setStringConversionColumn (...)] [4]. Nhưng tôi nghĩ rằng bạn vẫn phải thiết lập một cách rõ ràng CursorToStringConverter để null:

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

Xin lỗi, nhưng chặn thư rác sẽ không cho phép tôi đăng các liên kết đến các tài liệu Android mô tả các liên kết tôi đã đăng ở trên. Nhưng một tìm kiếm google nhanh chóng sẽ trỏ bạn đến các trang doc chính xác.

3

[Câu trả lời trễ, chỉ để lưu nội dung. Đã sửa đổi để xóa đề xuất của tôi rằng phân lớp là cần thiết.]

Để sử dụng SimpleCursorAdapter với AutoCompleteTextView, bạn cần đặt hai trình xử lý trên bộ điều hợp: CursorToStringConverterFilterQueryProvider. Giả sau:

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

Để giải quyết vấn đề tôi chỉ mở rộng SimpleCursorAdapter và thực hiện các phương pháp convertToString(). Sau đó, tôi tạo một thể hiện và đặt nó làm bộ điều hợp.

Để cho phép lọc trong AutoCompleteTextView khi sử dụng CursorAdapters tôi cũng đã sử dụng setFilterQueryProvider(). See this question.

lớp mở rộng của tôi bên trong Hoạt động trông như:

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")); 
    } 
} 
Các vấn đề liên quan