【问题标题】:Keep current scroll position when update listview更新列表视图时保持当前滚动位置
【发布时间】:2015-04-29 08:18:51
【问题描述】:

我想使用下面的代码获取新数据并将其更新到我的 listView 中, 我想要的是当我滚动到 listView 的底部时,它会自动更新并将新数据添加到列表中。

例如:像facebook一样,只在底部添加新数据而不滚动并保持当前位置

但我最终遇到了一些问题。 有哪些

1) 列表视图已更新,但它滚动回顶部。

listview .setOnScrollListener(new OnScrollListener() {
    private int currentVisibleItemCount;
    private int currentScrollState;
    private int currentFirstVisibleItem;
    private int totalItem;

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        this.currentScrollState = scrollState;
        this.isScrollCompleted();
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {

        this.currentFirstVisibleItem = firstVisibleItem;
        this.currentVisibleItemCount = visibleItemCount;
        this.totalItem = totalItemCount;

    }
    private void isScrollCompleted() {

        if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
                && this.currentScrollState == SCROLL_STATE_IDLE) {

            Log.d("this is", "the end");
            page = page + 1;
            call_function(page);

        }

    }
});

....
....
public void call_function(int page_number) {
...
...
    ListAdapter adapter = new SimpleAdapter(
                            getActivity(), user_List,
                            R.layout.user, new String[] {"user","date"},
                            new int[] {R.id.usr_name ,R.id.register_time});

    // updating listview

    setListAdapter(adapter);
}

有什么办法可以处理这个异常吗??

提前致谢。

【问题讨论】:

    标签: android android-listview android-adapter onscrolllistener


    【解决方案1】:

    当您更新Adapter 的数据时,您可以保存列表当前选定项的索引,并在呈现数据时将其设置回来。像这样的:

    int index = mList.getFirstVisiblePosition();
    // do your update stuff
    mList.smoothScrollToPosition(index);
    

    【讨论】:

      【解决方案2】:

      有一个简单的解决方案。不要在每次更新值时添加新的 ListAdapter,而是更新当前值。在适配器中弹出新数据后,调用

      adapter.notifyDataSetChanged();
      

      【讨论】:

      • 如果要使用notify datasetchanged(),适配器不能是simpleadapter吧?
      • 为什么不呢? SimpleAdapter 扩展了存在 notifyDataSetChanged 方法的 BaseAdapter
      • 有一个问题很棘手,你不能补充它:/他们在创造这个时到底在想什么:////
      【解决方案3】:

      最好在异步加载适配器并在执行前使用int currentIndex=displaylist.getFirstVisiblePosition(); 保持当前位置,并在通知适配器调用displaylist.smoothScrollToPosition(currentIndex); 后在 postExecute 刷新后您当前的查看位置将保持稳定。

      【讨论】:

        【解决方案4】:

        您需要保留列表视图滚动位置,解决方案已在此处解释Reataining listview scroll position

        【讨论】:

          【解决方案5】:

          请问如何将下面的适配器改成支持notifydatachanged的适配器???

          ListAdapter adapter = new SimpleAdapter(
                                      getActivity(), feeds_List,
                                      R.layout.feed_item, new String[] {"username","datetime","pts",},
                                      new int[] {R.id.usr_name ,R.id.feed_time,R.id.no_stamp});
          setListAdapter(adapter);
          

          feed_list 是数据更新到的ArrayList<HashMap<String, String>>

          R.id.usr_name ,R.id.feed_time,R.id.no_stamp
          

          是列表视图中的布局对象。

          所有代码都在一个 listactivity 中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-03-17
            • 1970-01-01
            • 2016-12-03
            • 2018-04-08
            • 1970-01-01
            • 1970-01-01
            • 2022-08-15
            • 1970-01-01
            相关资源
            最近更新 更多