2013-03-24 5 views
8

Ich bekomme eine ArrayIndexOutOfBoundsException mit der unten angegebenen benutzerdefinierten Implementierung einer ArrayAdapter mit Filterung aktiviert. Ich sehe, dass der Filtercode das korrekte Resultset zurückgibt, aber wenn die Ansicht nach dem Filtern gerendert wird, erhalte ich eine Ausnahme. Was mache ich hier falsch? Jede Hilfe ist appreaciated.ArrayIndexOutOfBoundsException mit ArrayAdapter mit Filter

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

     } 

    } 

} 

Ausnahme ist:

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) 

Update: hinzugefügt Ausnahme

+1

Könnten Sie auch das Fehlerprotokoll, das Sie bekommen? – Shade

+1

Veröffentlichen Sie den Stacktrace mit der Ausnahme. – Luksprog

+0

danke für die Antwort. StackTrace hinzugefügt – sab

Antwort

8

Sie benötigen ArrayAdapter die getCount Methode innerhalb Ihrer benutzerdefinierten zu implementieren. Die ListView ruft diese Methode auf ihrem Adapter auf, um herauszufinden, wie viele Elemente angezeigt werden. Sie benötigen etwas wie folgt:

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

Das war es vielen Dank für Ihre Hilfe – sab