2014-05-12 4 views
0

어댑터 클래스의 데이터를 필터링하는 동안 널 포인터 예외가 발생합니다. 여기에 코드가 있습니다. 검색은 정상적으로 작동하지만 검색을 완료하면 notifyDataSetInvalidated가 호출 될 때 오류가 발생합니다.널 포인터 예외를 일으키는 것으로 확인되었습니다.

어댑터 클래스 :

public class SongAdapter extends BaseAdapter implements Filterable { 
private ArrayList<Song> songs=new ArrayList<Song>(); 
private LayoutInflater songInf; 
private ArrayList<Song> glossariesListForSearch; 
private Context mContext; 
int layoutResourceId; 

public SongAdapter(Context c, ArrayList<Song> songs) { 
    super(); 
    this.mContext = c; 
    this.songs = songs; 
    this.glossariesListForSearch = songs; 
    this.songInf = LayoutInflater.from(c); 
} 

@Override 
public int getCount() { 

    return songs.size(); // error here 
} 

@Override 
public Object getItem(int arg0) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 

    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View view = convertView; 

    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) parent.getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = (LinearLayout) inflater 
       .inflate(R.layout.song, parent, false); 
    } 
    final int pos = position; 

    TextView textView = (TextView) view.findViewById(R.id.tv_song_title); 
    textView.setText(songs.get(position).getTitle()); 

    textView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Log.d(this.getClass().getName(), "onClick"); 
      ((MainActivity) mContext).songPicked(pos); 
     } 
    }); 

    view.setTag(position); 
    return view; 

} 

@Override 
public Filter getFilter() { 

    return myFilter; 
} 

Filter myFilter = new Filter() { 

    @SuppressWarnings("unchecked") 
    @Override 
    public void publishResults(CharSequence constraint, 
      FilterResults results) { 
     songs = (ArrayList<Song>) results.values; 

     if (results.count > 0) { 
      Log.i("Filtering", "Results count>0"); 
      notifyDataSetChanged(); 
     } else { 
      notifyDataSetInvalidated(); //error here 
     } 

    } 

    @Override 
    public FilterResults performFiltering(CharSequence constraint) { 
     FilterResults filterResults = new FilterResults(); 
     ArrayList<Song> tempGlossaryList = new ArrayList<Song>(); 

     if (constraint != null && constraint.toString().length() > 0) { 
      int length = glossariesListForSearch.size(); 
      Log.i("Filtering", "glossaries size" + length); 
      int i = 0; 
      while (i < length) { 

       Song item = glossariesListForSearch.get(i); 
       // Real filtering: 
       if (item.getTitle().toLowerCase() 
         .contains(constraint.toString().toLowerCase())) { 
        tempGlossaryList.add(item); 
       } 
       i++; 
      } 

      filterResults.values = tempGlossaryList; 
      filterResults.count = tempGlossaryList.size(); 
      Log.i("Filtering", "Filter result count size" 
        + filterResults.count); 
     } 
     return filterResults; 
    } 
}; 

    } 

05-12 12 : 12 : 13.311 : E/AndroidRuntime (1809) : 05-12 java.lang.NullPointerException이 12 : 12 : 13.311 : E/AndroidRuntime (1,809) : com.siju.multimediaplayer.SongAdapter.getCount (SongAdapter.java:53) 05-12 12 : 12 : 13.311 : E/AndroidRuntime (1809) : android.widget.AdapterView.checkFocus (AdapterView.java:712)) 05-12 12 : 12 : 13.311 : E/AndroidRuntime (1809) : android.widget.AdapterView $ AdapterDataSetObserver.onInvalidated (AdapterView.java:835) 05-12 12 : 12 : 13.311 : E/AndroidRuntime (1809)) : android.widget.AbsListView $ AdapterDa에서 (DataSetObservable.java:50) 05-12 12:12 : 0 android.database.DataSetObservable.notifyInvalidated (DataSetObservable.java:50) 13.311 : E/AndroidRuntime (1809) : android.widget.BaseAdapter.notifyDataSetInvalidated (BaseAdapter.java:59) 05-12 12 : 13.311 : E/AndroidRuntime (1809) : com.siju.multimediaplayer.SongAdapter $ 1 .publishResults (SongAdapter.java:116)

답변

0

한 줄을 변경하여 해결 결과

if (results!=null) { 
    if (results.count > 0) { 
     Log.i("Filtering", "Results count>0"); 
     notifyDataSetChanged(); 
    } else { 
     notifyDataSetInvalidated(); //error here 
    } 
} 
+0

귀하의 솔루션이 작동하지 않습니다

if (constraint != null && glossariesListForSearch!=null) 

로 변경되었습니다. – Siju

0

에 null 상태를 확인하십시오 :

if (constraint != null && constraint.toString().length() > 0) 

0 지금은 작동합니다 :)

관련 문제