2

私はAutoCompleteTextViewにカスタムレイアウトを使用し、Webサーバーからデータを取得しています。私はそれが設定されているので、アプリケーションは、ユーザーがEditTextフィールドに入力を止めてから500ミリ秒後にサーバーからデータを要求するだけです。AutoCompleteTextViewの結果が表示されてから消えます

唯一の問題は、AutoCompleteTextViewにテキストを入力すると、結果が500ミリ秒間表示されてから消えてしまうことです(空のドロップダウンのみ)。私はこれを引き起こしているのか分からない。ここで

は私の断片である:

public class MyFragment extends Fragment { 

    private AutoCompleteTextView autoCompleteField; 

    private Timer timer; 

    // 500 millisecond delay before showing the results 
    private TextWatcher textWatcher = new TextWatcher() { 
     @Override 
     public void afterTextChanged(Editable arg0) { 
      timer = new Timer(); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        String autoCompleteText = autoCompleteField.getText().toString(); 

        if (!autoCompleteText.isEmpty()) { 
         getResultsFromServer(autoCompleteText); 
        } 
       } 
      }, 500); 
     } 

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

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // Reset the timer 
      if (timer != null) { 
       timer.cancel(); 
      } 
     } 
    }; 

    public MyFragment() { 
     // Required empty public constructor 
    } 

    public static MyFragment newInstance() { 
     MyFragment fragment = new MyFragment(); 

     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_dog, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     autoCompleteField = (AutoCompleteTextView) view.findViewById(R.id.autoCompleteField); 

     autoCompleteField.addTextChangedListener(textWatcher); 
    } 

    public void getResultsFromServer(String query) { 
     ApiInterface apiService = ApiClient.createService(ApiInterface.class); 

     Call<List<Dog>> call = apiService.getDogBreeds(query); 
     call.enqueue(new Callback<List<Dog>>() { 
      @Override 
      public void onResponse(Call<List<Dog>> call, Response<List<Dog>> response) { 
       List<Dog> dogs = response.body(); 

       CustomAutoCompleteAdapter adapter = new CustomAutoCompleteAdapter(getContext(), dogs); 
       autoCompleteField.setAdapter(adapter); 
      } 

      @Override 
      public void onFailure(Call<List<Dog>> call, Throwable t) { 
       // 
      } 
     }); 
    } 
} 

そして、ここでは私のアダプタです:

public class CustomAutoCompleteAdapter extends ArrayAdapter<Dog> 
{ 
    private List<Dog> dogs; 
    private List<Dog> filteredDogs = new ArrayList<>(); 

    public CustomAutoCompleteAdapter(Context context, List<Dog> dogs) { 
     super(context, 0, dogs); 
     this.dogs = dogs; 
    } 

    @Override 
    public int getCount() 
    { 
     return filteredDogs.size(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Dog dog = filteredDogs.get(position); 

     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(R.layout.custom_autocomplete_layout, parent, false); 

     ImageView image = (ImageView) convertView.findViewById(R.id.image); 
     TextView text = (TextView) convertView.findViewById(R.id.text); 

     // Set the breed's image 
     Glide.with(context) 
      .load("http://www.website.com/dogs/" + dog.getId() + ".png") 
      .into(image); 

     // Set the breed name 
     text.setText(dog.getBreedName()); 

     return convertView; 
    } 

    @Override 
    public Filter getFilter() { 
     return new DogsFilter(this, dogs); 
    } 

    class DogsFilter extends Filter { 
     CustomAutoCompleteAdapter adapter; 
     List<Dog> originalList; 
     List<Dog> filteredList; 

     public DogsFilter(CustomAutoCompleteAdapter adapter, List<Dog> originalList) { 
      super(); 
      this.adapter = adapter; 
      this.originalList = originalList; 
      this.filteredList = new ArrayList<>(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      filteredList.clear(); 
      final FilterResults results = new FilterResults(); 

      if (constraint == null || constraint.length() == 0) { 
       filteredList.addAll(originalList); 
      } else { 
       final String filterPattern = constraint.toString().toLowerCase().trim(); 

       // Your filtering logic goes in here 
       for (final Dog dog : originalList) { 
        if (dog.getBreedName().toLowerCase().contains(filterPattern)) { 
         filteredList.add(dog); 
        } 
       } 
      } 

      results.values = filteredList; 
      results.count = filteredList.size(); 

      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      adapter.filteredDogs.clear(); 
      adapter.filteredDogs.addAll((List) results.values); 
      adapter.notifyDataSetChanged(); 
     } 
    } 
} 

(AutoCompleteTextView遅延を等しくするために起こるもの)の結果は、500ミリ秒間表示させることができるものとその後消えますか?

+0

、のような[この](http://stackoverflow.com/a/19860624/2252830) – pskink

答えて

2

これは、Timerを使用して500 msごとにタスクをスケジュールしているためです。あなたのafterTextChanged()メソッドで

に実装を変更します。それを簡単に

CustomAutoCompleteAdapter adapter; //declare globally 

@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     autoCompleteField = (AutoCompleteTextView) view.findViewById(R.id.autoCompleteField); 

     String autoCompleteText = autoCompleteField.getText().toString(); 
     if (!autoCompleteText.isEmpty()) { 
      getResultsFromServer(autoCompleteText); 
     } 
     autoCompleteField.addTextChangedListener(textWatcher); 
    } 



private TextWatcher textWatcher = new TextWatcher() { 

    long lastPress = 0l; 
    @Override 
    public void afterTextChanged(Editable arg0) { 
    } 

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

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     if (System.currentTimeMillis() - lastPress > 1000) { 
       lastPress = System.currentTimeMillis(); 
       adapter.getFilter().filter(s.toString()); //filter adpater data 
      } 
    } 
}; 
+0

これは異なるが、同様の問題を引き起こしているようです。今、私がフィールドに初めて入力したとき(「Hel」のような)、提案はうまく表示されますが、「Hello」のように単語を入力し続けると、その提案は再び消えます。 – user7704171

+0

大丈夫ですが、提案はユーザーの入力に基づいて変更されます... – rafsanahmad007

+0

私は答えを編集しました.... – rafsanahmad007

関連する問題