2012-02-08 17 views
5

một vấn đề mà tôi không thể giải quyết được.Android AutoCompleteTextView với dữ liệu từ dịch vụ web, sự cố hiển thị danh sách đề xuất

Điều tôi muốn đạt được: Hiển thị đề xuất trong AutoCompleteTextView bắt đầu từ cuộc gọi dịch vụ web. Kết quả cuối cùng sẽ giống như thế này:

enter image description here

Những gì tôi đã làm như vậy cho đến nay:

Trong cách bố trí của tôi, tôi có một AutoCompleteTextView như thế này

<AutoCompleteTextView 
      android:id="@+id/txtAutoSearch" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:selectAllOnFocus="true" 
      android:singleLine="true" /> 

On Hoạt động của tôi, tôi có này:

autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????, null); 
     autoCompleteAdapter.setNotifyOnChange(true); 
     txtAutoSearch.setAdapter(autoCompleteAdapter); 
      txtAutoSearch.addTextChangedListener(new TextWatcher() { 

       private boolean shouldAutoComplete = true; 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 
        shouldAutoComplete = true; 

       } 

       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        if (shouldAutoComplete) { 
         new GetAutoSuggestionsTask().execute(s.toString()); 
        } 
       } 

      }); 

Các AsyncTask là khá đơn giản, onPostExecute tôi đặt bộ chuyển đổi với các dữ liệu trả về từ WebService

autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????,result); 
txtAutoSearch.setAdapter(autoCompleteAdapter); 

Các adapter trông như thế này:

public class AdapterAutoComplete extends ArrayAdapter<Person> { 

    private Activity activity; 
    private List<Person> lstPersons; 
    private static LayoutInflater inflater = null; 

    public AdapterAutoComplete(Activity a, int textViewResourceId, List<Person> lst) { 
     super(a, textViewResourceId, lst); 
     activity = a; 
     lstPersons = lst; 
     inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return lstPersons.size(); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public Person getCurrentPerson(int position) { 
     return lstPersons.get(position); 
    } 

    public void removeItem(int position) { 
     lstPersons.remove(position); 
    } 

    public static class ViewHolder { 
     public TextView txtName; 
     public TextView txtProfession; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     ViewHolder holder; 
     if (convertView == null) { 
      vi = inflater.inflate(R.layout.people_list_item, null); 
      Utils.overrideFonts(activity, vi); 

      holder = new ViewHolder(); 
      holder.txtName = (TextView) vi.findViewById(R.id.txtName); 
      holder.txtProfession = (TextView) vi.findViewById(R.id.txtProfession); 

      vi.setTag(holder); 
     } else { 
      holder = (ViewHolder) vi.getTag(); 
     } 

     Person o = lstPersons.get(position); 

     if (o.name != null) { 
      holder.txtName.setText(o.name); 
     } else { 
      holder.txtName.setText("N/A"); 
     } 

     if (o.profession != null) { 
      holder.txtProfession.setText(o.profession); 
     } else { 
      holder.txtProfession.setText("N/A"); 
     } 
     return vi; 
    } 
} 

gì thực tế xảy ra:

  • dịch vụ web trả về danh sách tôi cần, vì vậy dữ liệu có sẵn
  • trong bộ chuyển đổi getView dường như không thực hiện vì vậy tôi đoán có cái gì đó sai trái được thực hiện trong đó.
  • không có danh sách đề xuất nào được hiển thị với các giá trị của tôi
  • Tôi không biết mình cần gì đối với bộ dựng bộ kết nối, cho textViewResourceId. Tôi đang làm gì sai? Tôi đang mắc kẹt xin vui lòng giúp đỡ.

Trả lời

-7

Thực tế cuối cùng tôi đã đi đến this route và trong runQueryOnBackground tôi vừa thực hiện cuộc gọi đến dịch vụ web của mình và tạo một Con trỏ chuột với các trường cần thiết. Tôi biết ... không phải là giải pháp tốt nhất nhưng hoạt động trong trường hợp của tôi.

7

Sau khi quét nhanh tài liệu, có vẻ như bạn đã đi đúng hướng.

Bạn cần yêu cầu bạn không đồng bộ để nhận danh sách kết quả từ nguồn bên ngoài. Tự động hoàn tất phải được kiểm tra lại trên mỗi lần nhấn phím (hủy yêu cầu dữ liệu trước đó), điều này sẽ được kích hoạt bằng cách sử dụng addTextChangedListener đó là những gì bạn đang làm. Càng xa càng tốt.

Từ danh sách kết quả này bạn cần phải xây dựng và điền vào Bộ điều hợp: Bộ điều hợp tùy chỉnh sẽ mở rộng ListAdapter & Có thể lọc (như được mô tả trong tài liệu setAdapter()).

Một khi bạn có một bộ chuyển đổi nó nên càng đơn giản như gọi:

// AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list); 
textView.setAdapter(adapter); 

Hãy nhớ rằng bất kỳ thay đổi giao diện người dùng nên được thực hiện trên giao diện người dùng chủ đề hoặc sử dụng một Handler.

getView() nên được gọi khi adapter có:

  • Changed với setAdapter()
  • .notifyDataSetChanged() đã được kêu gọi ListView.

Nếu hai sự kiện trên không gây ra mới getView() s.You phải đảm bảo các phương pháp getCount()getItem() đang quay trở lại các giá trị chính xác.

Các vấn đề liên quan