Android 允许在选择后滚动列表视图
我有一个listview,每当列表更新时,我都会将它强制滚动到列表的底部。但是,在滚动到列表底部后,出于某种原因,listview会固定在该点上,用户无法在列表上来回滚动以查看其他数据 问题:在Android 允许在选择后滚动列表视图,android,android-listview,Android,Android Listview,我有一个listview,每当列表更新时,我都会将它强制滚动到列表的底部。但是,在滚动到列表底部后,出于某种原因,listview会固定在该点上,用户无法在列表上来回滚动以查看其他数据 问题:在setSelection(list.getBottom())之后,我应该有什么才能允许再次滚动整个列表 @Override public View getView(int position, View convertView, ViewGroup parent) {
setSelection(list.getBottom())
之后,我应该有什么才能允许再次滚动整个列表
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/* the list is being populated here - the code has been omitted */
list.populateFrom(date, name, class);
list.clearFocus();
list.post(new Runnable() {
@Override
public void run() {
list.setSelection(list.getBottom());
}
});
return list;
}
}
问题在于你正在打电话
list.setSelection(list.getBottom());
在每次调用的getView()
中列表视图需要绘制更多视图。这意味着你不断向下滚动
相反,从适配器
类外部(例如从活动/片段
更新您拥有的数据集,然后重置列表视图
的适配器或清除适配器并读取项目,然后调用setSelection()
一种方法是:
启动活动
异步任务
通过AsyncTask
更新数据的doInBackground()
列表
- 在
中,使用从onPostExecute()
doInBackground()传递的
实例化列表
。或者清除当前拥有的适配器
,然后循环浏览列表并将项目重新添加到适配器的数据集
适配器
- 如果重新启动
,请将适配器
的列表视图
设置为您创建的适配器
- 调用
ListView#setSelection()
private class DownloadFilesTask extends AsyncTask<Void, Void, VOid> {
protected void onPreExecute()
{
//display progress dialog
}
protected Long doInBackground(Void... params) {
// get data from server
return null;
}
protected void onPostExecute(Void params) {
// dismiss dialog
//set data
// paste the above listview code here.
}
私有类下载文件任务扩展异步任务{
受保护的void onPreExecute()
{
//显示进度对话框
}
受保护的长doInBackground(无效…参数){
//从服务器获取数据
返回null;
}
受保护的void onPostExecute(void参数){
//取消对话框
//设置数据
//将上面的listview代码粘贴到此处。
}
}正如A--C所建议的,这是
list.setSelection(list.getBottom())
每次调用getView()时,您都会将视图移动/滚动到底部,因此,当您再次尝试滚动视图时,会调用getView(),然后再次移动到底部。
因此,您不应该在getView()中将listview中的选择设置为底部,而应该在活动/片段中进行选择。
在“活动”中,观察更改并将选择设置为底部
如果这对你的问题有帮助的解释,请投票表决谢谢你的精彩解释!我把我的SETELECT移到了其他地方,现在它工作得非常好:)
private class DownloadFilesTask extends AsyncTask<Void, Void, VOid> {
protected void onPreExecute()
{
//display progress dialog
}
protected Long doInBackground(Void... params) {
// get data from server
return null;
}
protected void onPostExecute(Void params) {
// dismiss dialog
//set data
// paste the above listview code here.
}