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) {} } 

}

Solutions Collecting From Web of "notifyDataSetChanged()不会自动更新ListActivity"

我有同样的问题(只有当我滚动ListView更新,即使notifyDataSetChanged没有帮助)。 我这样解决它:只是尝试做你的“视图修改”线程创build您的用户界面即

 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来告诉列表重绘。

我有同样的问题,而我的解决scheme是调用ListView上的requestLayout() 。

我认为适配器可能有一些问题, 也许它没有设置。

根据我的经验,总是有某种原因阻止了listview(和adapter)的更新。

在BaseAdapter.notifyDataSetChanged()之后调用ListView中的AbsListView.invalidateViews()

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

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

我认为你需要确保你创build一个适配器对象,然后在同一个对象上调用notifyDataSetChanged()。

您可以在创build适配器对象时以及调用notifyDataSetChanged()方法时debugging对象引用值。

 Why it works in first code ? 

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

 Why not work in second code ? 

—由于在将值设置为临时值之前,远程适配器设置为临时值,所以当您将新值设置为临时值时,您的适配器类可能无法获取更新的值..因为临时值不是公共或不在类级别静态。将临时声明放在根级别,然后尝试。

如果您收到任何警告,请按照要求和Logcat显示您的完整代码。