2013-06-06 27 views
8

Bir AutoCompleteTextView öğesine 2 TextView açılır menüsünü ayarlamak için herhangi bir basit yol var mı?Bir AutoCompleteTextView'a özel bir adaptör nasıl eklenir

android.R.layout.two_line_list_item var Hangi örnek nasıl bulacağımı bulamadınız.

Yani, bu çalıştı:

public class TwoLineDropdownAdapter extends BaseAdapter { 

    private LayoutInflater mInflater = null; 
    private Activity activity; 
    public ArrayList<TwoLineDropDown> values = new ArrayList<TwoLineDropDown>(); 

    public TwoLineDropdownAdapter(Activity a, ArrayList<TwoLineDropDown> items) { 

     values = items; 
     activity = a; 
     mInflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 

     return values.size(); 
    } 

    public TwoLineDropDown getItem(int position) { 

     return values.get(position); 
    } 

    public long getItemId(int position) { 

     return position; 
    } 

    public static class ViewHolder { 

     public TextView title; 
     public TextView description; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 

     ViewHolder holder; 

     if (convertView == null) { 

      holder = new ViewHolder(); 

      convertView = mInflater.inflate(R.layout.dropdown_text_twoline, 
        parent, false); 
      holder.title = (TextView) convertView 
        .findViewById(R.id.text1); 
      holder.description = (TextView) convertView 
        .findViewById(R.id.text2); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     return convertView; 
    } 

    public void add(TwoLineDropDown ei) { 

     values.add(ei); 
    } 
} 

Ama burada bir sorunla karşı karşıya:

: diyor Adaptör ayarlarken

TwoLineDropdownAdapter AutoCompleteAdapter = new TwoLineDropdownAdapter(this, items); 
myAutoComplete.setAdapter(AutoCompleteAdapter); 

Yanlış bağlı eşleşme: AutoCompleteTextView türünde genel yöntem setAdapter (T), (TwoLineDropdownAdapter) bağımsız değişkenleri için geçerli değildir. türetilmiş tip TwoLineDropdownAdapter Bu nasıl çözmek için sınırlı parametre

geçerli bir değişiklik değil mi?

belgelerine göre You

cevap

7

ederiz, AutoCompleteTextView içinde setAdapter ait Inferred türüdür:

<T extends ListAdapter & Filterable> void setAdapter(T adapter) 

(BaseAdapter olduğunu şimdiye kadar iyi) bir ListAdapter ve Filtrelenebilir olmalıdır Adaptörünüz Hangi BaseAdapter, ne de Adaptör uygulamanız değildir. Ben senin uygulanmasını (sizin yöntemlerden bazıları aynı sonuç için ArrayAdapter yöntemlerini çoğaltmak) basitleştirmek olur edilir bahsetmiyorum, Filtrelenebilir bir ArrayAdapter, uzanacak:

public class TwoLineDropdownAdapter extends ArrayAdapter<TwoLineDropDown> { 

    private LayoutInflater mInflater = null; 
    private Activity activity; 

    public TwoLineDropdownAdapter(Activity a, ArrayList<TwoLineDropDown> items) { 
     super(a, 0, items); 
     activity = a; 
     mInflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public static class ViewHolder { 

     public TextView title; 
     public TextView description; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 

     ViewHolder holder; 

     if (convertView == null) { 

      holder = new ViewHolder(); 

      convertView = mInflater.inflate(R.layout.dropdown_text_twoline, 
        parent, false); 
      holder.title = (TextView) convertView 
        .findViewById(R.id.text1); 
      holder.description = (TextView) convertView 
        .findViewById(R.id.text2); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     return convertView; 
    } 
} 
+8

Bu yöntemi uyguladı, ancak otomatik tamamlama görüntülenmiyor. – tony9099

+0

"ListAdapter & Filterable" eklentisini BaseAdapter'a genişletebilir misiniz? Ben şunu söyleyebilirim: adaptöre adaptör mü? – delive

+0

@delive, "ListAdapter" öğesini istediğiniz alt sınıfla değiştirebilirsiniz. – njzk2

15

İşte Kod benim için çalışıyor,

autocompletetextview

AutoCompleteTextView etProductSearch = (AutoCompleteTextView)getView().findViewById(R.id.edtSearchBoxTakeOrder); 
ProductSearchAdapter adapter = new ProductSearchAdapter(getActivity(), android.R.layout.simple_dropdown_item_1line, productList); 
etProductSearch.setAdapter(adapter); 

ProductSearchAdapter sınıfı

0 Bu adaptör ayarlama
+0

Teşekkürler! Bu gerçekten yardımcı oldu! Bir sorunum vardı - AutoCompleteTextView'imde açılan liste görünmedi ve özel bağdaştırıcımın getView yöntemi çağrılmadı. Tek yapmam gereken, bu örnekte olduğu gibi getFilter yöntemini eklemekti. –

0

En kolay yaklaşımın SimpleAdapter'u uzatmak olduğuna inanıyorum.

public class MyAdapter extends android.widget.SimpleAdapter { 

    static ArrayList<Map<String, String>> toMapList(Collection<MyObject> objectsCollection) { 
     ArrayList<Map<String, String>> objectsList = new ArrayList<Map<String, String>>(objectsCollection.size()); 
     for (MyObject obj : objectsCollection) { 
      Map<String, String> map = new HashMap<String, String>(); 
      map.put("name", obj.getName()); 
      map.put("details", obj.getDetails()); 
      objectsList.add(map); 
     }; 
     return objectsList; 
    } 

    public MyAdapter(Context context, Collection<MyObject> objects) { 

     super(context, toMapList(objects), 
       R.layout.auto_complete_layout, new String[] {"name", "description"}, new int[] {R.id.name, R.id.description}); 
    } 
} 

büyük dezavantajı bu isim veya açıklamada herhangi boşlukla ayrılmış kelime dayalı adayları getirecek olmasıdır. auto_complete_layout'unuza başka bir alan eklerseniz, eşleme de dahil olacaktır.

Bu nedenle, kullanım durumumla ilgili olmayan temel sınıf yükünün önemli bir miktarını kaldırarak, gereksinimlerime daha iyi uyacak şekilde SimpleAdapter'i yeniden yazmayı tamamladım. Ancak, yukarıdaki birkaç satır size iyi bir başlangıç ​​sağlar ve kişiselleştirmeyi başlatmak için sağlam bir başvuru kaynağı sağlar.

İlgili konular