问题描述
我在数百个用户中收到以下错误。我在我的代码中使用它是因为它要求我调用 notifyDataSetChanged() 但它不起作用。我在下面分享了我的适配器文件。我为此做了很多研究,但无法确定问题所在。我需要你的帮助。
问候。
Fatal Exception: java.lang.IllegalStateException
The content of the adapter has changed but ListView did not receive a notification.
确保您的适配器的内容不是从后台线程修改的,而是仅从 UI 线程修改的。确保您的适配器在其内容更改时调用 notifyDataSetChanged()。 [在 ListView(2131296786,class android.widget.ListView)
我的适配器代码:
public class TracksAdapter extends BaseAdapter {
private DatabaseReference mDatabaseReference;
Context context;
private static TracksAdapter mInstance = null;
private Activity activity;
private InterstitialAd interstitialAds;
private int pos = -1;
private LoadingDialog progress = null;
List<Track> trackItems;
public void showProgressDialog() {
progress = new LoadingDialog(context);
progress.setCircleColors(context.getResources().getColor(R.color.turu),context.getResources().getColor(R.color.turu),context.getResources().getColor(R.color.turu));
progress.show();
}
public void hideProgressDialog() {
if (progress != null) {
progress.dismiss();
progress = null;
}
}
protected void TracksAdapter(Activity activity) {
this.activity = activity;
}
public TracksAdapter(Context context,List<Track> rowItems) {
notifyDataSetChanged();
this.context = context;
this.trackItems = rowItems;
}
@Override
public int getCount() {
return trackItems.size();
}
@Override
public Object getItem(int position) {
pos = position;
if (trackItems != null && trackItems.size() > position) {
return trackItems.get(position); // Line 54.
}
return null;
}
@Override
public long getItemId(int position) {
return trackItems.indexOf(getItem(position));
}
/* private view holder class */
private class ViewHolder {
String id,names,phones,lastseens,dates;
TextView name;
TextView phone;
TextView lastseen;
Integer membership;
ImageView delete,file;
}
public static TracksAdapter getInstance() {
return mInstance;
}
@RequiresApi(api = Build.VERSION_CODES.O)
@SuppressLint("WrongViewCast")
@Override
public View getView(int position,View convertView,ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
}
}
}
解决方法
这就是我认为的问题所在,让我们先看看您的代码。这部分就在这里
public TracksAdapter(Context context,List<Track> rowItems) {
notifyDataSetChanged();
this.context = context;
this.trackItems = rowItems;
}
正如您所说,您正在调用 notifyDataSetChanged()
,但问题是它在哪里被调用。
您现在在对数据集进行任何更改之前调用它,您应该在分配 rowItems
之后调用它。你之前调用它,那时什么都没有改变。
所以正确的代码如下:
public TracksAdapter(Context context,List<Track> rowItems) {
this.context = context;
this.trackItems = rowItems;
notifyDataSetChanged();
}