我在我的应用程序中设置了一个计时器,我可以从Web服务获取一些信息,并生成一个列表视图来显示。现在我的问题是,每次计时器运行时,滚动回到开头......
如何在列表视图中每次刷新时保持滚动位置?
我的部分代码:
runOnUiThread(new Runnable() {
public void run() {
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(DashboardActivity.this,
all_chat,
R.layout.list_item,
new String[] { TAG_FULLNAME,
TAG_DATE,
TAG_MESSAGE },
new int[] { R.id.fullname,
R.id.date,
R.id.message }
);
// updating listview
setListAdapter(adapter);
}
});
TNX。
答案 0 :(得分:14)
请勿致电setAdapter()
。做这样的事情:
ListAdapter adapter; // declare as class level variable
runOnUiThread(new Runnable() {
public void run() {
/**
* Updating parsed JSON data into ListView
*/
if (adapter == null) {
adapter = new SimpleAdapter(
DashboardActivity.this, all_chat, R.layout.list_item, new String[]{TAG_FULLNAME, TAG_DATE, TAG_MESSAGE},
new int[]{R.id.fullname, R.id.date, R.id.message});
setListAdapter(adapter);
} else {
//update only dataset
allChat = latestetParedJson;
((SimpleAdapter) adapter).notifyDataSetChanged();
}
// updating listview
}
});
答案 1 :(得分:6)
您可以将以下属性添加到xml中的ListView
。
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
添加这些属性,您的ListView
将始终在底部绘制,就像您希望它在聊天中一样。
或者如果您想将其保留在以前的位置,请将alwaysScroll
替换为normal
in the android:transcriptMode attribute.
干杯!!!
答案 2 :(得分:2)
我遇到了同样的问题,尝试了很多东西来阻止列表更改其滚动位置,包括:
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
而不是致电listView.setAdapter();
直到找到this answer:
看起来像这样:
// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());
// ...
// restore index and position
mList.setSelectionFromTop(index, top);
说明:
ListView.getFirstVisiblePosition()
返回顶部可见列表项。但是此项可能会部分滚动到视图之外,如果要恢复列表的确切滚动位置,则需要获取此偏移量。因此,ListView.getChildAt(0)
会返回顶部列表项的View
,然后View.getTop() - mList.getPaddingTop()
会返回ListView
顶部的相对偏移量。然后,要恢复ListView
的滚动位置,我们使用我们想要的项目的索引调用ListView.setSelectionFromTop()
,并使用偏移量将其上边缘从ListView
的顶部定位。< / p>
答案 3 :(得分:1)
有一个good article by Chris Banes。对于第一部分,只需使用ListView#setSelectionFromTop(int)
将ListView
保持在同一个可见位置。为了防止ListView
闪烁,解决方案是简单地阻止ListView布置它的孩子。