Android AutoCompleteTextView显示错误的建议

时间:2014-05-31 21:25:47

标签: java android textview autocompletetextview

我让AutoCompleteTextView完美运行,直到我决定使用自定义适配器,这样我就可以自定义每一行的外观。以下是现在发生的事情:

enter image description here

如你所见,这个建议是错误的。发生的事情就像我输入的那样,它显示了正确的数字的建议,但它们的实际名称是列表中的第一个。所以在这一点上它应该只显示一个建议,即德克萨斯A& M,但它只是显示列表中的第一个。这是我实现我的适配器的方式。

//setup filter
List<String> allCollegesList = new ArrayList<String>();
for(College c : MainActivity.collegeList)
{
    allCollegesList.add(c.getName());
}
AutoCompleteDropdownAdapter adapter = new AutoCompleteDropdownAdapter(main, R.layout.list_row_dropdown, allCollegesList);
//the old way of using the adapter, which worked fine
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(main, android.R.layout.simple_dropdown_item_1line, allCollegesList);
textView.setAdapter(adapter);

和我的实际适配器类一样:

public class AutoCompleteDropdownAdapter extends ArrayAdapter<String>{

    MainActivity main;
    int rowLayout;
    List<String> allCollegesList;

    public AutoCompleteDropdownAdapter(MainActivity main, int rowLayout, List<String> allCollegesList) {
        super(main, rowLayout, allCollegesList);
        this.main = main;
        this.rowLayout = rowLayout;
        this.allCollegesList = allCollegesList;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        try{

            if(convertView==null){
                // inflate the layout
                LayoutInflater inflater = ((MainActivity) main).getLayoutInflater();
                convertView = inflater.inflate(rowLayout, parent, false);
            }

            // object item based on the position
            String college = allCollegesList.get(position);

            // get the TextView and then set the text (item name) and tag (item ID) values
            TextView collegeTextView = (TextView) convertView.findViewById(R.id.dropDownText);
            collegeTextView.setText(college);
            collegeTextView.setTypeface(FontManager.light);

        } catch (NullPointerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return convertView;

    }
}

1 个答案:

答案 0 :(得分:4)

此处发生的情况是,当AutoCompleteTextView调用getFilter ArrayAdapter方法时,会返回FilterArrayAdapter会过滤allCollegesList ,但不是你的Filter。当您输入第一个字符时,ArrayAdapter的方法会被调用,而0, 1, ...会在第一个位置(AutoCompleteTextView)过滤掉元素。但是,当getFilter使用您的实现来获取视图时。您使用列表就像没有进行过滤一样,并使用未过滤列表的第一个元素。

您也可以通过覆盖适配器的ArrayAdapter方法来过滤自己的列表。但那将是更多的编码而不是必要的。

您可以使用String college = getItem(position); 的方法而不是您自己的列表,而不是:

使用

String college = allCollegesList.get(position);

而不是

parent

顺便说一句:

您也可以使用getContext()方法从MainActivity获取上下文。这样您就可以将适配器与{{1}}分离。