自动完成文本框的适配器返回旧值

5

我实现了一个AutoCompleteTextView,其中数据在用户输入新文本时从服务器更新。它工作得很好。然而,每次我输入新的查询时,都会显示先前的结果,直到新的结果集被更新。

我猜测它会显示当前查询的结果,直到后端响应新的搜索结果。有没有一种方法可以清除当前的结果?

活动代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_test);

    actv = (AutoCompleteTextView) findViewById(R.id.actv);
    actv.setThreshold(1);
    actv.setAdapter(new SearchSuggestionsAdapter(this, actv.getText().toString()));

自定义适配器:

public class SearchSuggestionsAdapter extends ArrayAdapter<String> {

    List<String> types = new ArrayList<>();
    protected static final String TAG = "SuggestionAdapter";
    private List<String> suggestions;
    private Context context;

    public SearchSuggestionsAdapter(Activity context, String nameFilter) {
        super(context, android.R.layout.simple_dropdown_item_1line);
        suggestions = new ArrayList<String>();
        this.context = context;
    }

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

    @Override
    public String getItem(int index) {
        return suggestions.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter myFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();

                if (constraint != null) {

                    //Get new results from backend
                    //searchItemsFromServer is the method that returns the data
                    //new data is successfully sent. no problem there
                    List<String> new_suggestions = searchItemsFromServer(constraint.toString());
                    suggestions.clear();
                    for (int i = 0; i < new_suggestions.size(); i++) {
                        suggestions.add(new_suggestions.get(i));
                    }

                    filterResults.values = suggestions;
                    filterResults.count = suggestions.size();
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence contraint,
                                          FilterResults results) {
                if (results != null && results.count > 0) {
                    notifyDataSetChanged();
                } else {
                    notifyDataSetInvalidated();
                }
            }
        };
        return myFilter;
    }
}

Thank you in advance!


那么你已经为它添加了一个TextWatcher来确定何时清除它了吗? - Kapil G
@pskink 在您提供的链接中,fromto在以下代码行中是什么意思:SimpleCursorAdapter a = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, null, from, to, 0); - Jay
请问您能否将这个问题作为我的代码答案添加吗?@pskink - Jay
String[] columnNames = { BaseColumns._ID, "suggestion" }; 字符串数组 columnNames = {BaseColumns._ID,"suggestion"}; - pskink
我没有叫做suggestion的任何东西。你是不是指的那个名为suggestions的列表?@pskink - Jay
显示剩余17条评论
3个回答

3

将您的代码更改为以下活动

SearchSuggestionsAdapter searchSuggestionsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_test);

    searchSuggestionsAdapter = new SearchSuggestionsAdapter(this, actv.getText().toString());
    actv = (AutoCompleteTextView) findViewById(R.id.actv);
    actv.setThreshold(1);
    actv.setAdapter(searchSuggestionsAdapter);
    actv.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if(!hasFocus){
              searchSuggestionsAdapter.clear();
            }
        }
    });
}

将以下代码添加到您的SearchSuggestionsAdapter中。
/**
 * Create list and notify recycler view
 */
public void clear() {
    if (suggestions != null) {
        suggestions.clear();
        notifyDataSetChanged();
    }
}

0
 actv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                suggestionAdapter.clear;
            }
        });

当用户点击自动完成时,需要先删除旧的适配器。但是为此,您需要首先定义suggesstionAdapter,并且每次更新此适配器并将其设置为自动完成。


如果用户点击一次以获取焦点,然后不再点击会怎样?这只限于单击。 - Jay
那么也许使用 act.setOnFocusChangeListener 而不是 onClickListener 会更好? - FnR
我实际上尝试过使用文本监视器来解决这个问题。因此,每次输入新字符时,适配器都会被清除。但问题仍然存在。感谢您的建议。 - Jay
在您的TextWatcher的onTextChanged方法中,只需在触发clear之前检查字符串是否为空,否则不要清除,因为它将成为持续搜索的一部分。 - Kapil G

0

在过滤之前清除建议。调用adapter.clear();

在适配器中添加新方法

public void clear() {
        suggestions.clear();
        notifyDataSetChanged();
    }

这个会从哪里被调用? - Jay
自动完成文本更改监听器 - Pratik Popat
或者在performFiltering之上 - Pratik Popat
1
非常感谢您的回答,但不幸的是它没有起作用。旧的结果仍然显示。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接