2013-04-09 2 views
0

J'ai une activité avec un ListView qui utilise un SimpleAdapter. Voici l'onCreate:NullPointerException lors de la tentative de filtrage avec SimpleAdapter

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.contact_selection); 
    Intent intent = getIntent(); 
    mContactsList = (ListView) findViewById(R.id.contacts_list); 
    mContactAdapter = new SimpleAdapter(this, getEmailContacts(), R.layout.contact_list_item, 
      new String[] { CONTACT_FIELDS.NAME.toString(), CONTACT_FIELDS.PHOTOURI.toString(), 
        CONTACT_FIELDS.SECONDARY_DATA.toString(), CONTACT_FIELDS.TYPE.toString() }, 
      new int[] { R.id.contact_name, R.id.contact_image, R.id.contact_type_name, 
        R.id.contact_type_name }); 
    mContactsList.setAdapter(mContactAdapter); 
} 

Cela fonctionne très bien; la liste apparaît et est remplie correctement. Permettez-moi de souligner que - le problème n'est pas avec ma méthode getEmailContacts() étant nulle, puisque la liste est rendue correctement à ce stade.

Je suis en train d'ajouter le filtrage si, et j'ajouter cette ligne après mContactsList.setAdapter pour l'essayer:

mContactAdapter.getFilter().filter("Ca"); 

Il en résulte un accident, avec la trace de pile suivante:

FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93) 
    at android.widget.AdapterView.checkFocus(AdapterView.java:712) 
    at android.widget.AdapterView$AdapterDataSetObserver.onInvalidated(AdapterView.java:835) 
    at android.widget.AbsListView$AdapterDataSetObserver.onInvalidated(AbsListView.java:5966) 
    at android.database.DataSetObservable.notifyInvalidated(DataSetObservable.java:50) 
    at android.widget.BaseAdapter.notifyDataSetInvalidated(BaseAdapter.java:59) 
    at android.widget.SimpleAdapter$SimpleFilter.publishResults(SimpleAdapter.java:383) 
    at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5041) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    at dalvik.system.NativeStart.main(Native Method) 

Des suggestions? Est-ce que je manque quelque chose de vraiment évident?

Répondre

0

Il semble que votre méthode getEmailContacts() renvoie un objet nul. En regardant la source SimpleAdapter, la méthode getCount appelle simplement mData.size(), où mData est la liste des cartes de données que vous avez transmises au constructeur SimpleAdapter via la méthode getEmailContacts().

+0

Non, ce n'est pas le cas. Comme je l'ai dit, ça marche bien jusqu'à ce que j'appelle la méthode de filtrage. – Catherine

+0

Hmm, désolé - j'ai raté cette partie de votre question. J'espérais que ce serait aussi simple :) En regardant la source, il apparaît que la méthode filter change l'objet mData en objet FilterResults.values. Cela finit par être nul en quelque sorte. –

+0

Ouais, mais comment, là est la question. ;) – Catherine

Questions connexes