android - AutoCompleteTextView 结果出现然后消失

标签 android android-layout android-fragments android-adapter autocompletetextview

我有一个 AutoCompleteTextView,它使用自定义布局并从我的网络服务器检索数据。我已将其设置为应用程序仅在用户停止在 EditText 字段中输入内容后 500 毫秒才从服务器请求数据。

唯一的问题是,当我在 AutoCompleteTextView 中输入文本时,结果显示 500 毫秒,然后消失(仅显示空下拉列表)。我不确定是什么原因造成的。

这是我的 fragment :

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

什么可能导致结果显示 500 毫秒(恰好等于 AutoCompleteTextView 延迟)然后消失?

最佳答案

这是因为您使用 Timer 每 500 毫秒安排一次任务。在您的 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
            }
    }
};

关于android - AutoCompleteTextView 结果出现然后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768704/

相关文章:

android - XMPP与安卓交互

android - Android 开发手机、Android 普通手机和 Android root 手机之间的区别

Android PopupWindow 和 WRAP_CONTENT 不能一起工作

java - Android,如何将ListView适配器的位置减1

android 4.0 全屏

android - 使用 Locale.getDefault() 和 context.getResources().getConfiguration().locale 的语言环境有什么区别?

android:可以在 30 秒内使用 LocationManager 和 Samsung Galaxy S2 获取位置

android - 在不同设备的 Android 中管理软底栏时遇到问题

android - 以编程方式将 TableRow 添加到 TableLayout 不起作用

android - 以编程方式删除 ViewPager,何时(或如何确保)包含的 fragment 被销毁?