2012-10-02 18 views
8

में टेक्स्ट की बजाय ऑब्जेक्ट जानकारी दिखाता है I AutoCompleteTextView के साथ कस्टम एडाप्टर का उपयोग कर रहा हूं। यह एमुलेटर और मेरे टैबलेट पर ठीक काम करता है। हालांकि, मेरे फोन पर लैंडस्केप मोड में कोई समस्या है। इस मोड में दिखाए जा रहे ऑटो पूर्ण संकेत टेक्स्ट की बजाय ऑब्जेक्ट जानकारी हैं। हालांकि, जब मैं किसी भी आइटम का चयन करता हूं तो फ़ील्ड संबंधित क्षेत्रों में पाठ के साथ सही ढंग से आबादी हो जाती है।Android AutoCompleteTextView लैंडस्केप मोड

एंड्रॉइड स्टॉक ऐरे एडाप्टर पर आधारित अन्य फ़ील्ड के लिए ऑटो पूर्ण ठीक काम करता है।

क्या मुझे अपने कस्टम एडाप्टर में इसके लिए कुछ करना है? मैंने एसओ पर केवल एक ही सवाल देखा। उस प्रश्न के लिए एक प्रतिक्रिया 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(); 
      } 
     }  

    } 

} 

उत्तर

6

हाँ, बस अपने POJO पर toString() विधि ओवरराइड।

public class MyObject { 
    ... 

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

मैंने कोशिश की लेकिन यह काम नहीं करता .. शायद क्योंकि मैं फ़िल्टर और गेटव्यू विधियों को ओवरराइड कर रहा हूं ... जब मैंने डीबग करने की कोशिश की, तो निष्पादन पथ टॉस्ट्रिंग विधि में बिल्कुल नहीं जाता .. मैं और विवरण जोड़ूंगा और स्पष्टीकरण के लिए मेरे मूल प्रश्न के लिए कोड ... – Sriman

+0

जो मैं ArrayAdapter स्रोत डो में देखता हूं उसके आधार पर, मुझे लगता है कि मुझे getView विधि में कुछ करना है, लेकिन यह सुनिश्चित नहीं है कि वास्तव में क्या करने की आवश्यकता है ... जैसा कि मैंने कहा है कि यह टैबलेट और एमुलेटर पर पूरी तरह से काम करता है। यह मुद्दा केवल लैंडस्केप मोड में फोन पर है जब मेरे पास कस्टम दृश्य दिखाने के लिए पर्याप्त जगह नहीं है ... – Sriman

+0

अपने कस्टम एडाप्टर को देखने के बाद, जिसमें कोई जांच नहीं होनी चाहिए, ऐसा लगता है कि कारण 'ConfigChanges' है, क्या आपने फोन को पोर्ट्रेट से परिदृश्य में घुमाएं? यदि हां, तो [यहां] देखें (http://stackoverflow.com/questions/456211/activity-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_str_Info कक्षा का ऑब्जेक्ट वापस करने की आवश्यकता है ताकि मैं नाम, desg, संगठन प्राप्त कर सकूं और इससे हटा सकूं। मेरे ऑटो पूर्ण सुझाव दो पंक्तियों में से प्रत्येक हैं और दूसरे पर दूसरे तीन फ़ील्ड हैं ... इसलिए मैं सिर्फ एक स्ट्रिंग नहीं लौटा सकता .. मुझे पूरी वस्तु वापस करने की आवश्यकता है ... – Sriman

0

मुझे पिछली बार जवाब मिला है। मेरे पास एक ही समस्या थी और ऐसा लगता है कि स्वत: पूर्ण रूप से newView() और bindView() विधि के बजाय लैंडस्केप मोड में कंट्रोल टॉस्ट्रिंग() विधि का उपयोग करता है। आपको अपने सभी कर्सर डेटा को एक सिंगल स्ट्रिंग में "\ n" के बिना वापस करना होगा जैसे आइटम सॉफ्टकीबोर्ड पर क्षैतिज रूप से प्रदर्शित किए जाएंगे। अपने AutoCompleteTextViewAdapter में

उदाहरण के लिए, पद्धति जोड़ें:

 @Override 
    public CharSequence convertToString(Cursor cursor) { 


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


     return name+" : "+number; 
    } 

मैं अपने फोन एक्सपीरिया यू और एक अन्य गैलेक्सी नोट के साथ यह परीक्षण किया है और यह काम करता है। यह इतना आसान है। बेशक, आप इस विधि को पॉप्युलेट करेंगे जो आप इसे प्रदर्शित करना चाहते हैं।

+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 में सेट फ़िल्टर की। सबक्लास को अपने परिणामों को बदलने के लिए इस विधि को ओवरराइड करना चाहिए। डिफ़ॉल्ट कार्यान्वयन शून्य मानों के लिए एक खाली स्ट्रिंग या डिफ़ॉल्ट मान का स्ट्रिंग प्रतिनिधित्व देता है।

आपके मामले में ऐसा कुछ होना चाहिए: या वस्तु के संदर्भ के बजाय

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

इस विधि जोड़ना AutoCompleteTextView प्रदान करने के लिए अनुमति देगा संकेत को सही (लैंडस्केप दृश्य में) डिफ़ॉल्ट toString

संबंधित मुद्दे