Android AutoCompleteTextView在横向模式下显示对象信息而不是文本

我正在使用AutoCompleteTextView自定义适配器。 它在模拟器和我的平板电脑上工作正常。 但是,我的手机在横向模式下出现问题。 在此模式下显示的自动完成提示是对象信息而不是文本。 但是,当我select任何项目时,字段将正确填充各个字段中的文本。

自动完成的基于Android股票数组适配器的其他领域工作正常。

我必须在自定义适配器中为此做些什么? 我在SO上只看到一个类似的问题。 对这个问题的一个回应是谈论重写toString方法,但我不明白它足以在我的代码中实现。

任何指导将不胜感激? 请让我知道,如果你需要更多的信息。

编辑:添加我的自定义适配器源代码….

public class Part_Mstr_Info { private long part_id; private String name, desg, org, dept; public Part_Mstr_Info(long part_id, String name, String desg, String org, String dept) { this.part_id = part_id; this.name = name; this.desg = desg; this.org = org; this.dept = dept; } public long get_part_id() { return part_id; } public String get_name() { return name; } public String get_desg() { return desg; } public String get_org() { return org; } public String get_dept() { return dept; } } public class CustomAdapter extends ArrayAdapter<Part_Mstr_Info> implements Filterable{ private List<Part_Mstr_Info> entries; private ArrayList<Part_Mstr_Info> orig; private Activity activity; private ArrayFilter myFilter; public CustomAdapter(Activity a, int textViewResourceId, ArrayList<Part_Mstr_Info> entries) { super(a, textViewResourceId, entries); this.entries = entries; this.activity = a; } public static class ViewHolder{ public TextView tv_ac_name; public TextView tv_ac_desg; public TextView tv_ac_org; public TextView tv_ac_dept; } @Override public int getCount(){ return entries!=null ? entries.size() : 0; } @Override public Part_Mstr_Info getItem(int index) { return entries.get(index); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; if (v == null) { LayoutInflater vi = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.ac_name_list, null); holder = new ViewHolder(); holder.tv_ac_name = (TextView) v.findViewById(R.id.ac_name); holder.tv_ac_desg = (TextView) v.findViewById(R.id.ac_desg); holder.tv_ac_org = (TextView) v.findViewById(R.id.ac_org); holder.tv_ac_dept = (TextView) v.findViewById(R.id.ac_dept); v.setTag(holder); } else holder=(ViewHolder)v.getTag(); final Part_Mstr_Info custom = entries.get(position); if (custom != null) { holder.tv_ac_name.setText(custom.get_name()); holder.tv_ac_desg.setText(custom.get_desg()); holder.tv_ac_org.setText(custom.get_org()); holder.tv_ac_dept.setText(custom.get_dept()); } return v; } @Override public Filter getFilter() { if (myFilter == null){ myFilter = new ArrayFilter(); } return myFilter; } @Override public String toString() { String temp = getClass().getName(); return temp; } private class ArrayFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (orig == null) orig = new ArrayList<Part_Mstr_Info>(entries); if (constraint != null && constraint.length() != 0) { ArrayList<Part_Mstr_Info> resultsSuggestions = new ArrayList<Part_Mstr_Info>(); for (int i = 0; i < orig.size(); i++) { if(orig.get(i).get_name().toLowerCase().startsWith(constraint.toString().toLowerCase())){ resultsSuggestions.add(orig.get(i)); } } results.values = resultsSuggestions; results.count = resultsSuggestions.size(); } else { ArrayList <Part_Mstr_Info> list = new ArrayList <Part_Mstr_Info>(orig); results.values = list; results.count = list.size(); } return results; } @Override @SuppressWarnings("unchecked") protected void publishResults(CharSequence constraint, FilterResults results) { clear(); ArrayList<Part_Mstr_Info> newValues = (ArrayList<Part_Mstr_Info>) results.values; if(newValues !=null) { for (int i = 0; i < newValues.size(); i++) { add(newValues.get(i)); } if(results.count>0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } } 

Related of "Android AutoCompleteTextView在横向模式下显示对象信息而不是文本"

正确的方法是覆盖ArrayFilter私有类中的Filter#convertResultToString(Object)方法。

如Android文档中所述

public CharSequence convertResultToString(Object resultValue)

将过滤后的值转换为CharSequence。 子类应该重写这个方法来转换它们的结果。 默认实现返回空值的空string或值的默认string表示forms。

你的情况应该是这样的:

 private class ArrayFilter extends Filter { @Override public CharSequence convertResultToString(Object resultValue) { return ((Part_Mstr_Info) resultValue).get_name(); } 

添加此方法将允许AutoCompleteTextView提供更正提示(在横向视图中)而不是对象引用或默认的toString

是的,只需重写POJO上的toString()方法即可。

 public class MyObject { ... @Override public String toString() { return showThisStringOnAdapter; } } 

创build扩展<AutoCompleteTextView />自定义类。 例如:

 package lt.irisas.akcija.utils; import lt.irisas.akcija.data.ItemsModel; import android.content.Context; import android.database.Cursor; import android.util.AttributeSet; import android.widget.AutoCompleteTextView; /** Customizing AutoCompleteTextView to return Cursor column info as String */ public class CustomAutoCompleteTextView extends AutoCompleteTextView { public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } /* Overriding this method and returning String type solves the problem */ @Override protected CharSequence convertSelectionToString(Object selectedItem) { Cursor c = (Cursor) selectedItem; return c.getString(c.getColumnIndex("COLUMN_NAME")); } } 

但是,而不是<AutoCompleteTextView/>你必须使用你自定义的。 例如:

  <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <lt.irisas.akcija.utils.CustomAutoCompleteTextView android:id="@+id/search_field" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:singleLine="true" android:imeOptions="actionSearch" > </lt.irisas.akcija.utils.CustomAutoCompleteTextView> </LinearLayout> 

希望能帮助到你。 至less它为我做了。

我上次find答案了。 我有同样的问题,似乎自动完成使用横向模式convertToString()方法,而不是newView()和bindView()方法。 您必须将所有光标数据返回到一个没有“\ n”的单个string,例如项目将在软键盘上横向显示。

在你的AutoCompleteTextViewAdapter中添加如下的方法:

  @Override public CharSequence convertToString(Cursor cursor) { String name = cursor.getString(0); String number = cursor.getString(1); return name+" : "+number; } 

我用我的手机Xperia U和另一个Galaxy Note进行了testing,它的工作原理。 这很简单。 当然,你会根据你想要显示的内容填充这个方法。

这是你的答案:

 adapter.setCursorToStringConverter(new CursorToStringConverter() { @Override public CharSequence convertToString(Cursor c) { return c.getString(c.getColumnIndexOrThrow("Column")); } });