1

我想使用下面的代码获取新数据并将其更新到我的列表视图中,我想要的是当我滚动到listView的底部时,它会自动更新并添加新数据列入清单。当更新列表视图时保持当前滚动位置

E.g:像Facebook,只有新数据添加到底部,但不会滚动,并保持当前位置

但是,那时我落得有一些问题。 这是

1)listview被更新,但它滚动回顶部。

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

任何解决方案来处理这个异常?

在此先感谢。

回答

3

当您更新Adapter的数据可以保存列表当前所选项目的索引,并将其设置回当数据被渲染。事情是这样的:

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

有一个简单的解决方案。每次更新值时不要添加新的ListAdapter,而是更新当前值。一旦你在你的适配器POP操作的新数据,调用

adapter.notifyDataSetChanged(); 
+0

如果想要使用notify datasetchanged(),那么适配器不能是简单适配器吗? – enzo

+0

为什么不呢? SimpleAdapter扩展了其中包含notifyDataSetChanged方法的BaseAdapter –

+0

存在一个棘手的问题,您无法重新填充它:/他们在创建它时想到什么://// –

0

可我知道如何更改以下适配器插入支持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 

是listview中的布局对象。

所有代码都在listactivity内。

1

最好是加载适配器在异步和预执行继续使用int currentIndex=displaylist.getFirstVisiblePosition();和postExecute当前位置通知适配器呼叫displaylist.smoothScrollToPosition(currentIndex); 您当前正在查看位置会刷新后保持稳定后。

相关问题