notifyDataSetChanged()使列表刷新并滚动回到顶部

我试图实现一个无尽的滚动列表视图,但是当我调用notifyDataSetChanged()整个列表刷新然后滚动位置回到顶部。

这是正常的行为? 我怎样才能简单地添加添加的项目而不刷新,并保持滚动位置?

Solutions Collecting From Web of "notifyDataSetChanged()使列表刷新并滚动回到顶部"

这种行为是不正常的。 没有看到你的代码,我可以build议如下:

1)你不是从UI线程调用notifyDataSetChanged() 。 正确的方法是:

 runOnUiThread(new Runnable() { public void run() { adapter.notifyDataSetChanged(); } }); 

2)你不小心或不在调用adapter.notifyDataSetInvalidated();

3)在你的适配器中,你重写adapter.notifyDataSetChanged(); 方法和添加指令到顶部

4)如果您使用列表来填充适配器 – 您每次都提供新的列表,所以适配器设置被刷新。 你应该总是提供相同的列表。 但是,您可以根据需要更改它。 如果你重置列表使用list.clear而不是list = new ArrayList();

这里是我的适配器的一个例子:

 public class Adapter extends BaseAdapter { private Activity activity; private ArrayList<HashMap<String, String>> data; private static LayoutInflater inflater = null; public ImageLoader imageLoader; public MediaItemAdapter(Activity a, ArrayList<HashMap<String, String>> d) { activity = a; data = d; inflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader = new ImageLoader(activity.getApplicationContext()); } public int getCount() { return data.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; if (convertView == null) { vi = inflater.inflate(R.layout.item_composer, null); } TextView title = (TextView) vi.findViewById(R.id.item_title); // title TextView price = (TextView) vi.findViewById(R.id.price); return vi; } } 

呼叫适配器:

 List myList = new ArrayList<HashMap<String, String>>(); Adapter ma = new Adapter(this, myList); 

在适配器初始化之前myList可以是空的。

然后用我的列表做一些操作:

 myList.add(someElement); ma.notifyDataSetChanged(); 

如果你需要删除所有项目:

 myList.clear(); ma.notifyDataSetChanged(); 

这样的实现是相当漫长的,我看到了超过1.5万个元素,没有任何问题。

你可以用另一种方式来做,就像这样

 int position = scrollView.getSelectedItemPosition(); notifyDataSetChanged(); scrollView.setSelection(position); 

在我的情况下,问题是我每次调用ListView.setAdapter(adapter)新的数据时,也重置位置和视图跳转到顶部。

删除多余的setAdapter(...)调用为我解决了它。

如果您的适配器是adapter.clear() ArrayList那么调用adapter.clear()将调用notifyDataSetChanged()导致滚动位置丢失。 考虑先调用setNotifyOnChange(false)来防止这种情况。

更多信息在这里: https : //stackoverflow.com/a/14719538/383761