notifyDataSetChanged()不会自动更新ListActivity

我对BaseAdapter的notifyDataSetChanged()遇到了一些麻烦。 此方法在refreshItems()中调用,并将更新ListActivity的BaseAdapter。 在调用notifyDataSetChanged()之前没有任何反应,直到我使用箭头键向下滚动ListView。 不知怎的,修改后的getView()方法也没有被调用。 也许你可以给我一个提示 – 谢谢! 🙂

public class WinampControlClientPlaylist extends ListActivity { static WinampControlClientPlaylist activity = null; static EfficientAdapter adapter = null; static class EfficientAdapter extends BaseAdapter { public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); } private LayoutInflater mInflater; @Override public int getCount() { return Settings.playlistlength; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.listview, null); holder.text = (TextView) convertView.findViewById(R.string.playlist_title); holder.image = (ImageView) convertView.findViewById(R.string.playlist_play); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(Settings.playlist[position]); if (position == Settings.playlistPosition) { holder.text.setTypeface(null, Typeface.ITALIC); holder.image.setVisibility(0); } else { holder.text.setTypeface(null, Typeface.NORMAL); holder.image.setVisibility(4); } return convertView; } static class ViewHolder { TextView text; ImageView image; } @Override public Object getItem(int position) { return Settings.playlist[position]; } } void initialize() { adapter = new EfficientAdapter(this); setListAdapter(adapter); //registerForContextMenu(getListView()); } @Override public void onResume() { super.onResume(); // REFRESH PLAYLIST if (getListAdapter() == null && Settings.playlist != null) initialize(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.playlist); activity = this; } static void refreshItems() { try { adapter.notifyDataSetChanged(); } catch (Exception e) {} } 

}

我有同样的问题(ListView更新只有当我滚动它,甚至notifyDataSetChanged没有帮助)。 我这样解决:只是尝试在创建用户界面的线程中进行“视图修改”即

 activity.runOnUiThread(new Runnable() { public void run() { //do your modifications here // for example adapter.add(new Object()); adapter.notifyDataSetChanged() } }); 

尝试在ListView上调用invalidate()

正如Franco所指出的, notifyDataSetChanged()用于告诉ListView其适配器的内容已经改变,而不是它需要重绘自己。 您只是更改影响某些内容呈现方式的设置。 尝试调用refreshDrawableState来告诉列表重绘。

我有同样的问题,我的解决方案是在ListView上调用requestLayout() 。

我认为适配器可能存在一些问题; 也许它没有设定。

根据我的经验,始终存在某种阻止listview(和适配器)更新的原因。

在BaseAdapter.notifyDataSetChanged()之后调用listview上的AbsListView.invalidateViews()

我遇到了同样的问题,我试图在适配器上调用notifyDataSetChanged() 。 此外,我还尝试在视图上调用refreshDrawableState()invalidateViews() ,但没有一个工作。 所有这些方法都在UI线程中调用。 然后我发现这个如何清除ListView的RecycleBin中的视图? 。 最后setAdapter()工作,只有我创建一个新的适配器。

这背后的主要原因是您调用notifyDataSetChanged()的适配器的错误引用;

我认为您需要确保一次创建适配器对象并在同一对象上调用notifyDataSetChanged()。

您可以在创建适配器对象的时间以及调用notifyDataSetChanged()方法时调试对象引用值。

 Why it works in first code ? 

—因为您正在将值设置为临时列表并将适配器传递给它并将其显示到列表视图中。

 Why not work in second code ? 

—因为在将值设置为temp秒之前将适配器设置为temp,所以当您将新值设置为temp时,适配器类可能无法获取更新的值。因为temp不是公共的或不是类级别的static ..将temp声明放在root级别并尝试。

如果你收到任何警告,请尽可能多地显示你需要的完整代码和Logcat。