当前位置: 首页 > 知识库问答 >
问题:

NotefyDataSetChanged()使列表刷新和滚动跳回到顶部

颛孙正谊
2023-03-14

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

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

共有3个答案

强志学
2023-03-14

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

int position = scrollView.getSelectedItemPosition();
notifyDataSetChanged();
scrollView.setSelection(position);
锺离俊雄
2023-03-14
匿名用户

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

删除冗余setAdapter(...)调用为我修复它。

邹普松
2023-03-14

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

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

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

2) 您是否意外地调用了适配器。notifyDataSetionValidated()

3) 在适配器中,覆盖适配器。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万元素没有任何问题。

 类似资料:
  • 问题内容: 我正在尝试实现无穷尽的滚动列表视图,但是当我调用整个列表时,滚动位置将回到顶部。 这是正常现象吗?如何使它简单地添加添加的项目而不刷新并保持滚动位置? 问题答案: 这种行为是不正常的。我看不到您的代码,我建议您执行以下操作: 1)您不是从UI线程调用。正确的方法: 2)您是否偶然拨打了电话 3)在您的适配器中,您重写了方法并添加了说明以转到顶部 4)如果您使用列表来填充适配器- 每次都

  • 我使用了recycler视图来显示列表中的数据。 在我的应用程序中,我在每10秒的时间间隔后运行一个服务来更新列表中的数据。现在的问题是当我从服务获得数据时,每次列表滚动都会跳回到顶部位置。 我不知道代码出了什么问题。 我已经通过以下链接,但没有任何结果。 当我更新时,Recyclerview位置更改为第一个位置 使用顶部的新项目刷新recyclerView适配器 NOTIFYDATASETCHE

  • 我试过使用descendantFocusability=“blocksdescendents”,但这不起作用。 这是我的XML代码,可以在其中找到RecyclerView 用于向RecyclersView添加数据的代码是 所有应用程序都工作得很好,唯一的问题是滚动行为。当我在HIM中添加新数据时,我希望滚动位置不会出现在RecyclersView列表的顶部。

  • mescroll 下拉刷新,列表滚动到最底部,无法再次滚动? 最外层容器添加了mescroll,里面有一个滚动列表,总高度刚好占满一屏,现在如果下边滚动列表,滚动到到最底部,下拉刷新后,这个滚动列表就无法再滚动了,要怎么修改? mescroll官网地址

  • 我正在做一个西班牙新闻应用程序,看这里: 这个应用程序的问题是,每当任何用户点击like、play audio或translate按钮时,recyclerView就会跳到顶部。 > 数据以片段形式从Firebase实时数据库中获取。请帮帮忙。 @override public View onCreateView(LayoutInfluater Influater,ViewGroup contain

  • 问题内容: 这是我的onCreate,它处理适配器,LinearLayoutManager等。我尝试了每个选项以尝试将其滚动到顶部,但不能。我什至尝试创建自己的自定义LinearLayoutManager。 问题答案: 您尝试过还是? RecyclerView不会在其中实现任何滚动逻辑,而是更加具体,它会根据实现的布局转到特定的索引,在您的情况下是线性的。