2012-07-01 9 views
9

Có một khoảnh khắc trong ứng dụng của tôi, rằng tôi cần buộc phải hiển thị tất cả các mục trong danh sách đề xuất, bất kể người dùng đã nhập gì. Làm thế nào tôi có thể làm điều đó?AutoCompleteTextView lực để hiển thị tất cả các mục

Tôi đã cố gắng làm điều gì đó với bộ lọc, nhưng đối với tôi như một bộ lọc người mới bắt đầu chỉ là quá phức tạp, tôi đã thử tìm kiếm hướng dẫn cho người mới bắt đầu để lọc mà không có bất kỳ may mắn nào. Có lẽ, có một cách đơn giản hơn để buộc hiển thị tất cả các mục đề xuất?

EDIT: Về cơ bản ý tưởng của tôi là, khi người dùng nhập thứ gì đó không có trong danh sách, nó sẽ hiển thị tất cả các tùy chọn có sẵn mà anh có thể có.

Tôi đã tìm thấy cách tốt nhất để kiểm tra thời tiết ACTV được hiển thị hay không, nhưng onTextChangeEvent tôi so sánh văn bản đã nhập với danh sách của tôi và sau đó nếu không tìm thấy danh sách đầy đủ.

public void onTextChanged(CharSequence s, int start, int before, int count) 
     {     
      final EditText editText = (EditText) findViewById(R.id.vardsUserInput); 
      String strValue = editText.getText().toString().toUpperCase(); 
      String temp; 
      int Cc=0; //my count variable 
      for(int i=0; i<vardi.length; i++) 
      { 
       temp = vardi[i].toUpperCase(); 
       if(temp.startsWith(strValue.toUpperCase())) 
       { 
        Log.d("testing",vardi[i]); 
        Cc++;             
       } 
      }    
     if(Cc == 0) 
     { 
     //Show all the available options 
    textView.showDropDown();      
     }     
} 

Trả lời

8

Về cơ bản, sau 5-6 giờ thử nghiệm để hiểu làm thế nào các bộ lọc chết tiệt làm việc, tôi đã viết bộ chuyển đổi của riêng tôi mà thực hiện chính xác những gì tôi muốn:

public class burtuAdapteris extends ArrayAdapter<String> implements Filterable { 

     ArrayList<String> _items = new ArrayList<String>(); 
     ArrayList<String> orig = new ArrayList<String>(); 

     public burtuAdapteris(Context context, int resource, ArrayList<String> items) { 
      super(context, resource, items);  

      for (int i = 0; i < items.size(); i++) { 
       orig.add(items.get(i)); 
      } 
     } 

     @Override 
     public int getCount() { 
      if (_items != null) 
       return _items.size(); 
      else 
       return 0; 
     } 

     @Override 
     public String getItem(int arg0) { 
      return _items.get(arg0); 
     } 


     @Override 

     public Filter getFilter() { 
      Filter filter = new Filter() { 
       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 

        if(constraint != null) 
         Log.d("Constraints", constraint.toString()); 
        FilterResults oReturn = new FilterResults(); 

       /* if (orig == null){ 
        for (int i = 0; i < items.size(); i++) { 
         orig.add(items.get(i)); 
        } 
        }*/ 
        String temp; 
        int counters = 0; 
        if (constraint != null){ 

         _items.clear(); 
         if (orig != null && orig.size() > 0) { 
          for(int i=0; i<orig.size(); i++) 
          {       
           temp = orig.get(i).toUpperCase(); 

           if(temp.startsWith(constraint.toString().toUpperCase())) 
           { 

            _items.add(orig.get(i));    
counters++; 

           } 
          } 
         } 
         Log.d("REsult size:" , String.valueOf(_items.size())); 
          if(!counters) 
          { 
          _items.clear(); 
          _items = orig; 
          } 
         oReturn.values = _items; 
         oReturn.count = _items.size(); 
        } 
        return oReturn; 
       } 


       @SuppressWarnings("unchecked") 
       @Override 
       protected void publishResults(CharSequence constraint, FilterResults results) { 
        if(results != null && results.count > 0) { 
         notifyDataSetChanged(); 
         } 
         else { 
          notifyDataSetInvalidated(); 
         } 

       } 

      }; 

      return filter; 

     } 


} 

Và nó đơn giản để sử dụng, chỉ cần thay thế bộ chuyển đổi ban đầu với điều này:

final burtuAdapteris fAdapter = new burtuAdapteris(this, android.R.layout.simple_dropdown_item_1line, liste); 

Trong trường hợp liste của tôi là: ArrayList<String> liste = new ArrayList<String>();

+2

Tôi đang sao chép và dán, nhưng để lại tên BurtuAdapter để tỏ lòng tôn kính đối với công việc của bạn. :) – brainmurphy1

11

Bạn không xác định "thời điểm" khi bạn muốn hiển thị tất cả kết quả, vì vậy tôi hy vọng điều này phù hợp. Nhưng hãy thử một cái gì đó như thế này:

AutoCompleteTextView autoComplete; 
String savedText; 

public void showAll() { 
    savedText = autoComplete.getText().toString(); 
    autoComplete.setText(""); 
    autoComplete.showDropDown(); 
} 

public void restore() { 
    autoComplete.setText(savedText); 
} 
+1

Khi tôi cố gắng này, tôi ngay lập tức nhận được "Thật không may, ứng dụng này đã ngừng " Tôi đã không thực sự hiểu nơi tôi nên sử dụng chức năng khôi phục mặc dù. – XCoder

+0

Ok, sau đó tôi cần một số bối cảnh cho câu hỏi của bạn. Vui lòng đăng mã có liên quan mà bạn đã viết trong câu hỏi của mình và mô tả thời điểm bạn muốn hiển thị mọi thứ. – Sam

+0

Tôi đã chỉnh sửa và cố giải thích chính xác hơn những gì Im sau – XCoder

-1

Nó thậm chí còn dễ hơn Sam được liệt kê. Bất cứ khi nào bạn muốn hiển thị tất cả, chỉ cần làm:

performFiltering("", 0); 

Khi quá trình lọc kết thúc, nó sẽ tự động hiển thị trình đơn thả xuống với tất cả các mục hiển thị.

+0

Bạn có thể vui lòng cung cấp thêm một chút ngữ cảnh không? performFiltering() là một phương thức được bảo vệ của lớp [Filter] (http://developer.android.com/reference/android/widget/Filter.html). Có vẻ như tôi cần phải phân lớp Bộ lọc để có được bàn tay của tôi trên đó. – ge0rg

+0

Tôi không còn làm việc cho công ty khi tôi viết bài đó nữa và tôi chưa chạm vào Android kể từ khi rời họ vào tháng 12, vì vậy rất tiếc tôi không còn có quyền truy cập vào mã đó trong ngữ cảnh nữa. Lấy làm tiếc. – ArtOfWarfare

2

phương thức hiển thị danh sách thả xuống mạnh mẽ.

bạn cần phải gọi requestFocus(); để hiển thị bàn phím, nếu không bàn phím không bật lên.

autocomptv.setOnTouchListener(new OnTouchListener() { 

     @SuppressLint("ClickableViewAccessibility") 
     @Override 
     public boolean onTouch(View paramView, MotionEvent paramMotionEvent) { 
      // TODO Auto-generated method stub 
      autocomptv.showDropDown(); 
      autocomptv.requestFocus(); 
      return false; 
     } 
    }); 
1

này làm việc cho tôi một cách hoàn hảo, đây là một cách dễ dàng để giải quyết vấn đề:

final ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_dropdown_item_1line, usernameLists); 
    etUsername.setThreshold(1); 
    etUsername.setAdapter(adapter); 
    etUsername.setOnTouchListener(new View.OnTouchListener() { 

     @SuppressLint("ClickableViewAccessibility") 
     @Override 
     public boolean onTouch(View paramView, MotionEvent paramMotionEvent) { 
      if (usernameLists.size() > 0) { 
       // show all suggestions 
       if (!etUsername.getText().toString().equals("")) 
        adapter.getFilter().filter(null); 
       etUsername.showDropDown(); 
      } 
      return false; 
     } 
    }); 
+0

Lol soo ngắn hơn và đơn giản hơn các giải pháp khác, hoàn thành công việc, sử dụng AutoCompleteTextView thay cho Spinner chết tiệt, với điều này tôi có thể đặt gợi ý và lỗi và không bao giờ phải sử dụng lại spinner đó, cảm ơn :) – user3718908

+0

Tôi đã sử dụng OnClickListener mặc dù và đặt thuộc tính có thể đặt tiêu điểm thành sai. – user3718908

0

Như "ArtOfWarfare" gợi ý, bạn có thể chỉ sub-class và ghi đè performFiltering():

public class My_AutoCompleteTextView extends AutoCompleteTextView { 
    public My_AutoCompleteTextView(Context context) { 
     super(context); 
    } 
    public My_AutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public My_AutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void performFiltering(CharSequence text, int keyCode) { 
     super.performFiltering("", 0); 
    } 
} 
1

Nếu bạn muốn hiển thị các đề xuất ngay lập tức, thì bạn phải ghi đè enoughToFilter() để luôn trả về giá trị đúng. Để bỏ qua những gì được đưa ra dưới dạng nhập văn bản, bạn phải sử dụng performFiltering("", 0) với mẫu lọc trống. Sau đó, AutoCompleteTextView hiển thị tất cả các đề xuất.

Đây là giải pháp tôi đã kết hợp từ bài viết StackOverflow khác:

public class InstantAutoComplete extends android.support.v7.widget.AppCompatAutoCompleteTextView { 
    public InstantAutoComplete(Context context) { 
     super(context); 
    } 

    public InstantAutoComplete(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public InstantAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public boolean enoughToFilter() { 
     return true; 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 

     if (focused && getAdapter() != null) { 
      performFiltering("", 0); 
     } 
    } 
} 
0

Đây là những gì làm việc cho tôi:

public class CustomAutoCompleteTextView extends AutoCompleteTextView { 
    public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean enoughToFilter() { 
     return true; 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 
     if (focused) { 
      performFiltering(getText(), 0); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     this.showDropDown(); 
     return super.onTouchEvent(event); 
    } 
}