2012-04-12 3 views
0

Je vais vous donner un bref aperçu de ce que je suis en train de faire: Je veux remplir le DropDown d'un AutoCompleteTextView avec mes propres objets. ces objets contiennent 3 chaînes. Dans le list_item_view devrait être 2 des chaînes. Cette liste devrait être filtrable.Custom Arrayadapter avec filtre personnalisé

Maintenant un peu de code, ce que je l'ai fait « jusqu'à maintenant:

Mon CustomAdapter ressemble à ceci:

public class CustomerAdapter : ArrayAdapter<CustomerSingle>, IFilterable 
{ 
    private ws_test.Test ws=null; 
    public static List<CustomerSingle> _contactList; 
    private Activity _activity; 
    private CustomerAdapterFilter filter = null; 

    public CustomerAdapter(Activity activity, Context context,int resourceId)//List<CustomerSingle> assets) 
    :base(context,resourceId)//,assets) 
    { 
     _activity = activity; 
     ws=new ws_test.Test(); 
     _contactList = new List<CustomerSingle>(); 
    } 

    public static List<CustomerSingle> getCustomerList() 
    { 
     return _contactList; 
    } 

    public void Add(CustomerSingle item) 
    { 
     _contactList.Add(item); 
    } 

    public override int Count 
    { 
     get { return _contactList.Count; } 
    } 

    public override long GetItemId(int position) 
    { 
     return _contactList[position].id; 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     var view = convertView ?? _activity.LayoutInflater.Inflate(Resource.Layout.details, parent, false); 
     var contactName = view.FindViewById<TextView>(Resource.Id.Name); 
     var contactAddress = view.FindViewById<TextView>(Resource.Id.Address); 
     contactName.Text = _contactList[position].name;// +"\n" + _contactList[position].address; 
     contactAddress.Text = _contactList[position].address; 

     return view; 
    } 

    public override Filter Filter 
    { 
     get 
     { 
      return new CustomerAdapterFilter(); 
     } 
    } 

    public override void NotifyDataSetChanged() 
    { 
     base.NotifyDataSetChanged(); 
    } 

    public override void NotifyDataSetInvalidated() 
    { 
     base.NotifyDataSetInvalidated(); 
    } 
} 

Le CustomerSingle ressemble à ceci:

public class CustomerSingle 
{ 
    public string no { get; set; } 
    public string name { get; set; } 
    public string address { get; set; } 
    public int id { get; set; } 

    public CustomerSingle(string no, string name, string address, int id) 
    { 
     this.address = address; 
     this.name = name; 
     this.no = no; 
     this.id = id; 
    } 
} 

Ok , maintenant j'ai besoin d'un filtre propre ce que j'essaie de faire ici: public class CustomerAdapterFilter: Filtre {

protected object mLock = new object(); 
    protected List<CustomerSingle> mOriginalValues = null; 

    protected override FilterResults PerformFiltering(Java.Lang.ICharSequence prefix) 
    { 

     FilterResults results = new FilterResults(); 
     if (mOriginalValues == null) { 
      lock(mLock) { 
       mOriginalValues = new List<CustomerSingle>(CustomerAdapter._contactList); 

      } 
     } 

     if (prefix == null || prefix.Length() == 0) { 
      lock (mLock) { 
       List<CustomerSingle> list = new List<CustomerSingle>(mOriginalValues); 
       IntPtr listptr = list. 
       results.Values = list; 
       results.Count = list.Count; 
      } 
     } else { 
      String prefixString = prefix.ToString().ToLowerInvariant(); 

      List<CustomerSingle> values = mOriginalValues; 
      int count = values.Count; 

      List<CustomerSingle> newValues = new List<CustomerSingle>(count); 

      for (int i = 0; i < count; i++) { 
       CustomerSingle value = values.ElementAt(i); 
       String valueText = value.ToString().ToLowerInvariant(); 

       // First match against the whole, non-splitted value 
       if (valueText.StartsWith(prefixString)) { 
        newValues.Add(value); 
       } else { 
        String[] words = valueText.Split(' '); 
        int wordCount = words.Length; 

        for (int k = 0; k < wordCount; k++) { 
         if (words[k].StartsWith(prefixString)) { 
          newValues.Add(value); 
          break; 
         } 
        } 
       } 
      } 

      results.Values = (Object) newValues; 
      results.Count = newValues.Count; 
     } 

     return results; 
    } 

    protected override void PublishResults(Java.Lang.ICharSequence constraint, Filter.FilterResults results) 
    { 
     //noinspection unchecked 
     var mObjects = results.Values; 
     if (results.Count > 0) 
     { 
      NotifyDataSetChanged(); 
     } 
     else 
     { 
      notifyDataSetInvalidated(); 
     } 
    } 
} 

Mon problème est, je ne peux pas convertir de java.lang.Object à ma personne CustomerSingle ... Deos une idée?

Merci!

Mise à jour: Je changé JavaList dans le filtre et a fait l'extension à java.lang.Object au CustomerSingle

+1

Pouvez-vous s'il vous plaît fournir le code entier? Parce que j'ai du mal à faire ce travail. –

Répondre

1

Faites votre sous-classe de la classe CustomerSingle java.lang.Object:

public class CustomerSingle : Java.Lang.Object

MISE À JOUR:

Je pense que cette ligne:

results.Values = (Object) newValues;

essaie de convertir en System.Object au lieu de Java.Lang.Object, essayez (Java.Lang.Object) à la place.

+0

Bonne idée, fait cela, mais ça n'apporte pas l'effet nécessaire ... dois-je remplacer quelque chose de Java.Lang.Object? – Martin

+0

Merci pour votre aide. je l'ai maintenant! – Martin

+1

Pourriez-vous s'il vous plaît élaborer sur la solution ... – anz

Questions connexes