2013-03-24 15 views
8

Otrzymuję ArrayIndexOutOfBoundsException z podaną poniżej niestandardową implementacją ArrayAdapter z włączoną funkcją filtrowania. Widzę, że kod filtrujący zwraca poprawny zestaw wyników, ale kiedy widok jest renderowany po filtrowaniu, otrzymuję wyjątek. Co robię źle tutaj. Każda pomoc jest doceniana.ArrayIndexOutOfBoundsException z ArrayAdapter z filtrem

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(); 
      } 

     } 

    } 

} 

Wyjątek jest:

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) 

Aktualizacja: dodano wyjątek

+1

Czy możesz również opublikować otrzymany dziennik błędów? – Shade

+1

Po przesłaniu stosu wyjątek. – Luksprog

+0

dzięki za odpowiedź. Dodano analizę stosu – sab

Odpowiedz

8

Trzeba wdrożyć metodę getCount w swoim zwyczaju ArrayAdapter. ListView wywołuje tę metodę na adapterze, aby dowiedzieć się, ile elementów będzie wyświetlanych. Potrzebujesz czegoś takiego:

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

To było wielkie dzięki za pomoc – sab

Powiązane problemy