1

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

问题:之后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;
    }
}
4

3 回答 3

3

问题在于您正在打电话

 list.setSelection(list.getBottom());

in ,每次ListView 需要绘制更多视图时getView()都会调用它。这意味着您不断向下滚动。

相反,从类外部(例如从 )更新您拥有的数据集,然后Adapter重置Activity/FragmentListView适配器或清除适配器并读取项目,然后调用setSelection()

一种方法:

  • Activity开始一个AsyncTask

  • AsyncTask通过更新List数据doInBackground()

  • 在中,用传递的 fromonPostExecute()实例化。或者清除您当前拥有的数据集,然后循环遍历列表并将项目重新添加到.AdapterListdoInBackground()AdapterAdapter

  • 如果重新实例化,请将'Adapter设置为您创建的内容。ListViewAdapter

  • 称呼ListView#setSelection()

于 2013-03-10T05:03:08.243 回答
0
   cus= new Customlistadapter(paramets for customer adapter));//Custom list adapter
   lv1 = (ListView) findViewById(R.id.list);
   lv1.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
   lv1.setStackFromBottom(true);
   cus.notifyDataSetChanged();// for refreshing listview with updates
   lv1.setAdapter(cus);
   cus.registerDataSetObserver(new DataSetObserver() {
   @Override
   public void onChanged() {
    super.onChanged();
    lv1.setSelection(cus.getCount() - 1);    
   }
 });

在您的活动课程中使用上述内容。A--C 指出了问题所在。

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

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

}

于 2013-03-10T05:12:50.473 回答
0

正如 A--C 所建议的那样,这是问题

list.setSelection(list.getBottom());

每次调用 getView() 时,您都会将视图移动/滚动到底部,因此,当您尝试再次滚动视图时,会调用 getView() 并再次移动到底部。因此,与其将列表视图中的选择设置为 getView() 的底部,不如在您的活动/片段中进行。在活动中,您观察更改并将选择设置到底部。

如果这对您的问题有帮助的解释,请投票

于 2013-03-10T05:39:34.900 回答