Android 允许在选择后滚动列表视图

Android 允许在选择后滚动列表视图,android,android-listview,Android,Android Listview,我有一个listview,每当列表更新时,我都会将它强制滚动到列表的底部。但是,在滚动到列表底部后,出于某种原因,listview会固定在该点上,用户无法在列表上来回滚动以查看其他数据 问题:在setSelection(list.getBottom())之后,我应该有什么才能允许再次滚动整个列表 @Override public View getView(int position, View convertView, ViewGroup parent) {

我有一个listview,每当列表更新时,我都会将它强制滚动到列表的底部。但是,在滚动到列表底部后,出于某种原因,listview会固定在该点上,用户无法在列表上来回滚动以查看其他数据

问题:在
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()

在你的活动课上使用以上内容。A--C已经指出了问题所在

如果您在活动类中使用AYSNTASK,请尝试以下代码

  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. 
 }