2013-03-24 14 views
8

Ricevo un ArrayIndexOutOfBoundsException con la seguente implementazione personalizzata di un ArrayAdapter con filtro abilitato. Vedo il codice di filtraggio che restituisce il set di risultati corretto, ma quando la visualizzazione viene renderizzata dopo il filtraggio, ottengo un'eccezione. Cosa sto facendo di sbagliato qui. Qualsiasi aiuto è apprezzato.ArrayIndexOutOfBoundsException con ArrayAdapter con filtro

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.ImageView; 
import android.widget.TextView; 
import com.syntrio.iwm.act.R; 

public class IWMArrayAdapter<T> extends ArrayAdapter<T>{ 

    Activity activity; 
    List<T> mItems; 
    String[] icons; 
    boolean isArrowNeeded=false; 
    boolean isIconNeeded=false; 
    private ItemsFilter mFilter; 


    public IWMArrayAdapter(Activity context,List<T> items) { 
     super(context, R.layout.item_row,items); 
     activity=context; 
     mItems=items; 
    } 

    public void setIcons(String[] iconList){ 
     if(iconList!=null && iconList.length>0){ 
      icons=iconList; 
      isIconNeeded=true; 
     } 
    } 
    public void setArrowNeeded(){ 
     isArrowNeeded=true; 
    } 

    @Override 
    public View getView(int position, View convertView,ViewGroup parent) { 
     View row = convertView; 
     if (row == null) { 
      LayoutInflater inflater = activity.getLayoutInflater(); 
      row = inflater.inflate(R.layout.item_row_array, parent, false); 
     } 
     TextView label = (TextView) row.findViewById(R.id.label); 
     label.setText(mItems.get(position).toString()); 
     ImageView icon; 
     ImageView arrow; 
     if(isIconNeeded){ 
      icon = (ImageView) row.findViewById(R.id.row_image); 
      if(icons.length==1){ 
       icon.setImageResource(activity.getResources().getIdentifier(icons[0], "drawable", "com.syntrio.iwm.act")); 
      } 
      else{ 
       icon.setImageResource(activity.getResources().getIdentifier(icons[position], "drawable", "com.syntrio.iwm.act")); 
      } 
      icon.setVisibility(View.VISIBLE); 
     } 
     if(isArrowNeeded){ 
      arrow = (ImageView) row.findViewById(R.id.row_arrow); 
      arrow.setImageResource(activity.getResources().getIdentifier("arrow", "drawable", "com.syntrio.iwm.act")); 
      arrow.setVisibility(View.VISIBLE); 
     } 


     return (row); 
    } 

    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new ItemsFilter(); 
     } 
     return mFilter; 

    } 

    private class ItemsFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      // We implement here the filter logic 
      if (constraint == null || constraint.length() == 0) { 
       // No filter implemented we return all the list 
       results.values = mItems; 
       results.count = mItems.size(); 
      } 
      else { 
       // We perform filtering operation 
       List<T> itemsList = new ArrayList<T>(); 

       for (T t : mItems) { 
        if (t.toString().toUpperCase().startsWith(constraint.toString().toUpperCase())) 
         itemsList.add(t); 
       } 

       results.values = itemsList; 
       results.count = itemsList.size(); 

      } 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 

      // Now we have to inform the adapter about the new list filtered 
      if (results.count == 0){ 
       notifyDataSetInvalidated(); 
      } 
      else { 

       List<T> lst = (List<T>)results.values; 
       List<T> itemsList = new ArrayList<T>(lst); 
       //this.items=mItems; 
       mItems =itemsList;    
       notifyDataSetChanged(); 
      } 

     } 

    } 

} 

eccezione è:

03-24 16:52:11.608: E/AndroidRuntime(947): FATAL EXCEPTION: main 
03-24 16:52:11.608: E/AndroidRuntime(947): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1 
03-24 16:52:11.608: E/AndroidRuntime(947): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257) 
03-24 16:52:11.608: E/AndroidRuntime(947): at java.util.ArrayList.get(ArrayList.java:311) 
03-24 16:52:11.608: E/AndroidRuntime(947): at com.syntrio.iwm.IWMArrayAdapter.getView(IWMArrayAdapter.java:50) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.AbsListView.obtainView(AbsListView.java:1409) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.ListView.measureHeightOfChildren(ListView.java:1216) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.ListView.onMeasure(ListView.java:1127) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.View.measure(View.java:8313) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.View.measure(View.java:8313) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.View.measure(View.java:8313) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.View.measure(View.java:8313) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.View.measure(View.java:8313) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.View.measure(View.java:8313) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.ViewRoot.performTraversals(ViewRoot.java:839) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.os.Looper.loop(Looper.java:130) 
03-24 16:52:11.608: E/AndroidRuntime(947): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-24 16:52:11.608: E/AndroidRuntime(947): at java.lang.reflect.Method.invokeNative(Native Method) 
03-24 16:52:11.608: E/AndroidRuntime(947): at java.lang.reflect.Method.invoke(Method.java:507) 
03-24 16:52:11.608: E/AndroidRuntime(947): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-24 16:52:11.608: E/AndroidRuntime(947): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-24 16:52:11.608: E/AndroidRuntime(947): at dalvik.system.NativeStart.main(Native Method) 

Aggiornamento: aggiunto eccezione

+1

Potresti pubblicare anche il log degli errori? – Shade

+1

Invia lo stacktrace con l'eccezione. – Luksprog

+0

grazie per la risposta. Aggiunto stacktrace – sab

risposta

8

È necessario implementare il metodo getCount entro la vostra abitudine ArrayAdapter. Lo ListView invoca quel metodo sul suo adattatore per scoprire quanti oggetti verrà visualizzato. Hai bisogno di qualcosa del genere:

public int getCount() { 
    return mItems.size(); 
} 
+0

Questo è stato grazie mille per il tuo aiuto – sab

Problemi correlati