AutoCompleteTextView将Object设置为String

问题描述 投票:0回答:2

我目前正在使用AutoCompleteTextView。在下拉列表中有几个条目。但现在我遇到了问题。如果单击其中一个条目,则会将单击的元素的Object设置为ACTV中的String。但我不知道为什么。我试图设置一个OnItemClickListener。无论有没有它,Object to String都会被设置。在将字符串设置为ACTV之前,会调用ArrayAdapter的getItem方法。

可能是什么问题呢?我认为不需要任何代码,因为它只是一个简单的ACTV和ArrayAdapter。

ArrayAdapter:

private int LIMIT = 4;

private BasicDataObject[] basicDataObjects = new BasicDataObject[0];
private int resourceCourse, resourceVideo;

public SearchAutoCompleteArrayAdapter(Context context, int resourceCourse, int resourceVideo) {
    super(context, resourceCourse);
    this.resourceCourse = resourceCourse;
    this.resourceVideo = resourceVideo;
}


public void insertAll(BasicDataObject[] basicDataObjects) {
    this.basicDataObjects = basicDataObjects;
    this.clear();
    for (int i = 0; i < basicDataObjects.length; i++) {
        this.insert(basicDataObjects[i], i);
    }
    this.notifyDataSetChanged();
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (basicDataObjects[position] instanceof Course) {
            convertView = inflater.inflate(resourceCourse, parent, false);
        } else {
            CourseEntry courseEntry = (CourseEntry) basicDataObjects[position];
            convertView = inflater.inflate(resourceVideo, parent, false);
            ImageView imageView = convertView.findViewById(R.id.image_view_playlist);
            imageView.setImageDrawable(courseEntry.getImage(getContext()));
            TextView textView = convertView.findViewById(R.id.text_view_search_element_text);
            textView.setText(courseEntry.getCourseName());
        }

    }
    convertView.setTag(basicDataObjects[position]);
    return convertView;
}


@Override
public int getCount() {
    return minimumSize();
}

private int minimumSize() {
    return Math.min(basicDataObjects.length, LIMIT);
}

@Override
public BasicDataObject getItem(int position) {
    if (basicDataObjects.length == 0) return null;
    return basicDataObjects[position];
}

执行:

 this.searchAutoCompleteArrayAdapter = new SearchAutoCompleteArrayAdapter(this.getContext(), R.layout.auto_complete_layout_search_course,
            R.layout.auto_complete_layout_search_video);
    this.setAdapter(searchAutoCompleteArrayAdapter);
android android-arrayadapter autocompletetextview
2个回答
0
投票

这个问题在这里:

 if (basicDataObjects[position] instanceof Course) {
    convertView = inflater.inflate(resourceCourse, parent, false);
  } 

如果它是Courseof Course你没有设置任何东西。

也重写此方法:

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
     //add the same logic that you have in getView
    }

这告诉适配器在DropDown打开时显示哪个视图。


0
投票

没有问题。它的工作原理应该如此。您需要覆盖对象中的toString()方法。

每个对象都使用toString()方法和ArrayAdapter来显示使ArrayAdapter是通用的数据,换句话说,独立于自定义类。

UPDATE

您还需要在适配器中覆盖getDropDownView()。那个是针对ACTV中的选定视图。顺便说一句,你的getView()中存在逻辑问题。它总是膨胀相同的视图。它不是ViewHolder模式的正确实现。

另一种方法是覆盖getItemViewType()并在getView()中使用其返回值来标识不同行的类型。

    @Override public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ... // Your logic comes here

        return convertView;
   }
© www.soinside.com 2019 - 2024. All rights reserved.