有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java AutoCompleteTextview未显示第一个字符输入的下拉建议

我有一个AutoCompleteTextView{}和一个String[] usernames= {"Lex","Lincoln","Luther"}从数据库中获取

问题:我第一次在AutoCompleteTextView中键入字母“L”,没有显示任何建议。如果我按backspace删除“L”,然后再次键入“L”,则建议使用“Lex”、“Lincoln”和“Luther”。我希望在首次输入内容时显示建议

public class SearchFriendsActivity extends AppCompatActivity {

Firebase userbase;

AutoCompleteTextView searchFriends;

ArrayAdapter adapter;

char firstChar;
String url, listOfusers, inputUsername, userss;
String[] usersArray;

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

    searchFriends= (AutoCompleteTextView)findViewById(R.id.searchFriends);

    searchFriends.addTextChangedListener(new TextWatcher() {

        private Timer timer = new Timer();
        private final long DELAY = 1000; // milliseconds

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

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {                   
                }


        @Override
        public void afterTextChanged(Editable s) {
            timer.cancel();
            timer = new Timer();
            timer.schedule(
                    new TimerTask() {
                        @Override
                        public void run() {
                            ((Activity) context).runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (s.length() == 0) {
                                        firstChar = '.';
                                    } else {
                                        if (firstChar == s.charAt(0)) {
                                            aVoid();
                                        } else {
                                            firstChar = s.charAt(0);
                                            url = @string/databaseString + firstChar.toString() + "/";
                                            userbase = new Firebase(url);
                                            createArray();
                                        }
                                    }
                                }
                            });
                        }
                    },
                    DELAY
            );

        }
    });

}

public void createArray() {
    userbase.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listOfusers = dataSnapshot.getValue().toString();
            userss = listOfusers.replaceAll("=.*?\\}", "").replace("{", "").replace("}", "").replace(", ", ",");
            usersArray = userss.split(",");

            aVoid();
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
}

public void aVoid() {
    adapter = new ArrayAdapter(this, R.layout.suggestion_dropdown_item, usersArray);
    searchFriends.setThreshold(1);
    searchFriends.setAdapter(adapter);
}
}

共 (4) 个答案

  1. # 1 楼答案

    将此行添加到AutoCompleteTextView

    android:completionThreshold="1"
    
  2. # 2 楼答案

    我解决了这个问题,在创建适配器后不久,用edittext中的相同文本替换文本:

    public void replaceAllText() {
    
        Timer timer = new Timer();
        final long DELAY = 300; // milliseconds
    
        timer.cancel();
        timer = new Timer();
        timer.schedule(
                new TimerTask() {
                    @Override
                    public void run() {
                        ((Activity) context).runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                String replace = searchFriends.getText().toString();
                                searchFriends.setText(replace);
                                searchFriends.setSelection(searchFriends.getText().length());
                            }
                        });
                    }
                },
                DELAY
        );
    }
    
  3. # 3 楼答案

    一旦适配器中有了完整的列表,就很容易做到:

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Filterable adapter = (Filterable) searchFriends.getAdapter();
            adapter.getFilter().filter(s);
        }
    
  4. # 4 楼答案

    尝试将onTextChanged内的代码放入afterTextChange,因为在onTextChanged中,AutoCompleteTextView内的文本尚未在每次输入字符时设置为它。所以在你的第一次输入(例如“L”)时,AutoCompleteTextView.getText().toString;的值仍然是null,这就是你有问题的原因

    onTextChanged通常用于捕获被按下的键,以便在将其附加到AutoCompleteEditText的上一个值之前执行检查或验证

    另一方面aftetTextChangeAutoCompleteEditText的前一个值更改后被激发(顾名思义)。因此,最好将代码放在afterTextChanged中,而不是放在onTextChanged