允许在setSelection之后滚动listview

时间:2013-03-10 04:54:26

标签: android android-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;
    }
}

3 个答案:

答案 0 :(得分:3)

问题在于您正在呼叫

 list.setSelection(list.getBottom());
getView()中的

,每次都称为 ,ListView需要绘制更多的视图。这意味着你不断向下滚动。

相反,请更新外部 Adapter类的数据集(例如来自Activity/Fragment),然后重置ListView适配器或清除适配器并读取项目,然后调用setSelection()

一种方法:

  • Activity开始AsyncTask

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

  • onPostExecute()中,使用从Adapter传递的List来实例化doInBackground()。或者清除当前Adapter的数据集,然后循环浏览列表并将项目重新添加到Adapter

  • 如果要重新验证Adapter,请将ListView的{​​{1}}设置为您创建的内容。

  • 致电Adapter

答案 1 :(得分: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. 
 }

}

答案 2 :(得分:0)

正如A - C所建议的那样,

存在问题
  

list.setSelection(list.getBottom());

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

如果这对您的问题有用,请执行upvote