어댑터 클래스의 데이터를 필터링하는 동안 널 포인터 예외가 발생합니다. 여기에 코드가 있습니다. 검색은 정상적으로 작동하지만 검색을 완료하면 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)
귀하의 솔루션이 작동하지 않습니다
로 변경되었습니다. – Siju