我目前正在使用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);
答案 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打开时显示哪个视图。