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

2022-09-01 01:51:24

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

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


答案 1

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

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

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

2)您不小心拨打了电话adapter.notifyDataSetInvalidated();

3)在适配器中,您可以覆盖该方法并添加指令以转到顶部adapter.notifyDataSetChanged();

4) 如果您使用列表来填充适配器 - 则每次都提供新列表,因此适配器设置将刷新。您应始终提供相同的列表。但是,您可以根据需要更改它。如果要重置列表,请使用而不是list.clearlist = 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();

这样的实现是无止境的,我看到超过15000个元素没有任何问题。


答案 2

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

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


推荐