AutoCompleteTextView将Object设置为String

时间:2017-12-28 11:17:00

标签: android android-arrayadapter autocompletetextview

我目前正在使用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);

2 个答案:

答案 0 :(得分:0)

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

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

<强>更新

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

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

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

        return convertView;
   }

答案 1 :(得分:0)

这个问题在这里:

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

如果是课程的实例,则表示您没有设置任何内容。

同样覆盖此方法:

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

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