2012-10-02 9 views
8

AutoCompleteTextViewでカスタムアダプタを使用しています。エミュレータとタブレットで正常に動作します。しかし、私の電話では風景モードで問題があります。このモードで表示されるオートコンプリートヒントは、テキストではなくオブジェクト情報です。しかし、項目を選択すると、フィールドにはそれぞれのフィールドのテキストが正しく入力されます。Android AutoCompleteTextViewは、横向きモードのテキストではなくオブジェクト情報を表示します

Android Stock Array Adapterをベースにした他のフィールドの自動完了機能が正常に動作します。

カスタムアダプターで何かする必要がありますか?私はSOに関する1つの同様の質問しか見ませんでした。その質問に対する1つの応答は、toStringメソッドのオーバーライドについて話していましたが、私のコードで実装するのに十分理解できませんでした。

ご迷惑をおかけざいますか?詳しい情報が必要な場合はお知らせください。

EDIT:私のカスタムアダプタのソースコードを追加しました....

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(); 
      } 
     }  

    } 

} 

答えて

6

はい、ちょうどあなたのPOJO上のtoString()メソッドをオーバーライドします。

public class MyObject { 
    ... 

    @Override 
    public String toString() { 
     return showThisStringOnAdapter; 
    } 
} 
+0

私はこれを試しても動作しません..おそらく私もフィルタとgetviewのメソッドをオーバーライドしているので...私はデバッグしようとしたとき、実行パスはtoStringメソッドにまったく行きません..私は詳細を追加します私の元の質問に明確にするためにコード... – Sriman

+0

ArrayAdapterソースのdoeに表示されている内容に基づいて、getViewメソッドで何かをしなければならないと感じましたが、正確に何が行われる必要があるのか​​分かりません...私が言ったように、タブレットとエミュレータでは完全に機能します。私が持っているカスタムビューを表示するのに十分なスペースがない場合、問題はランドスケープモードでのみ発生します。 – Sriman

+0

probesを持たないCustomAdapterを見た後、原因が 'ConfigChanges'であるようです電話機を縦向きから横向きに回転させますか?はいの場合は[こちら](http://stackoverflow.com/questions/456211/actest-restart-on-rotation-android)をご覧ください。 – Aprian

3

<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> 

希望します。まあ、少なくともそれは私のためにやった。

+0

私のために働かない...理由は、私はクラスのオブジェクトを返す必要があるPart_Mstr_Info私はそれから名前、desg、orgとdeptを得ることができるように。私の完全な自動提案は2行目で、最初のフィールドと2フィールド目の3つのフィールドにそれぞれ名前が付いています。文字列を返すことはできません。完全なオブジェクトを返す必要があります... – Sriman

0

私は最後に答えを見つけました。私は同じ問題があり、オートコンプリートでは、newView()とbindView()メソッドの代わりにlandscapeToでconvertToString()メソッドを使用しているようです。ソフトキーボード上に項目が水平に表示されるように、カーソルデータをすべて "\ n"のない単一の文字列に戻す必要があります。あなたのAutoCompleteTextViewAdapterで

例は、メソッドの追加:

 @Override 
    public CharSequence convertToString(Cursor cursor) { 


     String name = cursor.getString(0); 
     String number = cursor.getString(1); 


     return name+" : "+number; 
    } 

私は自分の携帯電話のXperia Uと他のギャラクシーノートでそれをテストし、それが動作します。それは簡単です。 もちろん、表示する内容に応じてこのメソッドを設定します。

+0

ありがとう...数日後にこれを試して、何が起こるかを報告してください... – Sriman

0

これはあなたの答えです:

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

それを行うための正しい方法は、あなたのArrayFilterプライベートクラスでメソッドをオーバーライドFilter#convertResultToString(Object)ています。

としては、公開されたCharSequence convertResultToString(resultValueオブジェクト)

濾過したCharSequenceにセットからの値を変換は

Androidのドキュメントに前記しましたサブクラス は、結果を変換するためにこのメソッドをオーバーライドする必要があります。デフォルトの の実装では、null値の空のStringまたはデフォルトの の値の文字列を返します。あなたのケースでは

それはそのようなものでなければなりません。代わりに、オブジェクト参照の

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

がAutoCompleteTextViewを提供できるようになります。このメソッドを追加する(ランドスケープビューで)ヒントを修正するか、デフォルトのtoString

関連する問題