我在我的应用程序中设置了一个计时器,我可以从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);
}
});
Run Code Online (Sandbox Code Playgroud)
TNX.
我有一个获取初始DataSource的ListView.然后,用户可以运行搜索,该搜索将使用新的DataSource更新ListView.不幸的是,当发生这种情况时,滚动位置会重置,这并不理想.
我尝试重用相同的ListView.DataSource对象而不是创建一个新对象,但这给了我相同的结果:
...
dataSource: new ListView.DataSource({
rowHasChanged: (r1, r2) => r1 !== r2
}),
componentWillReceiveProps(nextProps) {
this.setState({
dataSource: this.dataSource.cloneWithRowsAndSections({...});
}
...
Run Code Online (Sandbox Code Playgroud)
我在dataSource更改后尝试在ListView上使用scrollTo,但是这会让应用程序跳转很多......不是很好的体验.是否有ListView设置或更新数据源的不同方法,以防止滚动位置重置?
ListView有2个粘性标题,顶部标题有2行页面描述和一个渲染3图像网格的redux容器.第二部分是最多50个组件的列表,这些组件的渲染有点重:正方形图像,一些文本和一些SVG.我当前的方法使用onContentSizeChange强制滚动位置,但这会导致滚动位置跳跃,它看起来很业余.
更新:深入研究ListView的文档和源代码,最终只需渲染ScrollView.我可以使用contentOffset来设置初始滚动位置,但是当ListView DataSource更新时它似乎没有帮助; 甚至硬编码contentOffset也无济于事.我也尝试将scrollEnabled设置为false,这确实阻止了用户驱动的滚动,但是当它的DataSource更新时,ListView滚动位置仍然被重置:s
更新2:我做了一些进一步的调试,发现建议的rowHasChange和sectionHeaderHasChanged函数只能很好地渲染需要渲染的行/节头.
我有tabView,在每个标签中显示列表.当我在一个选项卡中滚动时,切换到另一个选项卡并返回到上一个选项卡,位置返回到顶部而不是显示上一个滚动位置.我该如何实现这一目标?需要知道如何使用onSaveInstanceState和onRestoreInstanceState来保存位置并使用保存的位置来显示上一个滚动位置.
提前致谢.
谢谢大家的回复.我尝试了所有的解决方案,但遇到了其他问题.基本上我面临的问题如下.
当我启动我的应用程序时,我有一个listview作为我的第一个活动.当我单击列表项时,它会启动包含3个选项卡的选项卡活动.所有3个选项卡都使用名为ListActivity的相同活动.但是3个标签包含不同的数据.我的问题是当我在选项卡之间切换时如何保留列表的位置.通过提供上述解决方案,当我在一个选项卡中更改位置时,它也会影响其余选项卡.例如,如果我在第一个选项卡中的位置6,则此位置将设置为第二个和第三个选项卡,以及我对所有3个选项卡使用相同的ListActivity.我不被允许分享代码.所以必须这么长时间输入问题.创建的选项卡数量也是动态的.它可能是3或4或5.但是所有选项卡都使用1个ListActivity.
任何人都可以给我一个如何实现这一目标的例子.1.单个ListActivity在多个选项卡中使用.2.在影响其他选项卡后,将光标位置保留在选项卡中.
您的解决方案表示赞赏.提前致谢.
我正在使用MergeAdapter(来自Mark Murphy的优秀系列项目).您将它与ListView一起使用.我正在尝试在刷新时重建适配器的内容(而不是刷新"就地"并调用notifyDataSetChange()).
我想得到listview的y滚动值,所以我可以在重建列表后重置为该值.这似乎不可能吗?
谢谢
在我的活动中,我有一个滚动视图,其中包含具有许多视图的线性布局.有没有办法在开始此活动时显示特定视图(来自线性布局)?默认情况下,此视图是隐藏的,因此我必须滚动滚动视图才能使其可见.
非常感谢,Gratzi
我在我的Android应用程序中使用PullToRefresh.到目前为止工作正常.
我面临的问题是,当我从TOP新行中下载新的x行时,推出现有行并从0位置开始,这对用户来说很烦人.我想要的是,在下载新的行集后,列表应保留在那里,让用户向下查看新的行集.
任何想法我怎么能实现这一目标?
我想使用下面的代码获取新数据并将其更新到我的 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 …Run Code Online (Sandbox Code Playgroud) 似乎ListView没有以与ScrollView相同的方式公开其y位置.换句话说:我需要记住ListView滚动到的确切位置,并在我返回活动时设置它.
只是为了澄清:我不需要选择的项目......这很简单.我需要恢复ListView上精确的像素y位置.
谢谢!
我正在开发一个活动中有多个片段的android应用程序.我在片段里面使用网格视图.当我更改片段然后将堆栈弹回到旧片段时,网格视图滚动位置被更改为位置零.如何在片段弹回堆栈后保持网格视图滚动位置?