2011-06-15 89 views
7

我正在開發一個應用程序,我需要顯示一些列表視圖控件。我只是在我的活動中實現了OnScrollListener,以便監視我的listview內容,但是當我爲我的活動設置佈局時,它不會調用onScroll事件。如果我評論該塊,那麼它調用它就好了。我該如何解決這個問題?onScroll事件不會觸發列表視圖

package com.Threadtest; 

import com.Threadtest.main.myRunnable; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.AbsListView.OnScrollListener; 

public class TestList extends ListActivity implements OnScrollListener { 

    Aleph0 adapter = new Aleph0(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test); 
     ListView listview=(ListView)findViewById(android.R.id.list); 
     listview.setAdapter(adapter); 
     /*setListAdapter(adapter); 
     getListView().setOnScrollListener(this);*/ 
    } 

    public void onScroll(AbsListView view, 
     int firstVisible, final int visibleCount, int totalCount) { 

     Log.i("TestList", "firstVisible="+firstVisible+" visibleCount="+visibleCount+" totalCount="+totalCount); 
     boolean loadMore = /* maybe add a padding */ 
      firstVisible + visibleCount >= totalCount; 

     if(loadMore) { 
      Log.i("TestList", "In Notify"); 
      Thread thread = new Thread() 
      { 
        @Override 
        public void run() { 
         try { 
         this.sleep(10000); 
         runOnUiThread(new myRunnable(adapter,visibleCount)); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 


        } 
       }; 

      thread.start(); 

     } 
    } 

    public void onScrollStateChanged(AbsListView v, int s) { } 

    class myRunnable implements Runnable 
    { 
     Aleph0 adapter; 

     public myRunnable(Aleph0 adapter,int visibleCount) 
     { 

      this.adapter=adapter; 
      this.adapter.count += visibleCount; 
     } 
     public void run() { 
      // TODO Auto-generated method stub 
      Log.i("TestList", "List Count="+adapter.count); 
       adapter.notifyDataSetChanged(); 
     } 

    } 

    class Aleph0 extends BaseAdapter { 
     int count = 40; /* starting amount */ 

     public int getCount() { return count; } 
     public Object getItem(int pos) { return pos; } 
     public long getItemId(int pos) { return pos; } 

     public View getView(int pos, View v, ViewGroup p) { 
      if(pos!=count-1) 
      { 
       TextView view = new TextView(TestList.this); 
       view.setText("entry " + pos); 
       return view; 
      } 
      TextView view = new TextView(TestList.this); 
      view.setText("Loading.. " + pos); 
      return view; 

     } 
    } 
} 
+1

我很困惑。你的意思是說,如果你省略getListView()。setOnScrollListener(this)',它不起作用? – dmon 2011-06-15 12:36:00

+0

是的。如果一個Ommit的getListView()。setOnScrollListener(this)它不會被解僱。 – ram 2011-06-15 12:45:37

+0

對,如果你省略了監聽器,它不會觸發。什麼是真正的問題,**你想在沒有設置監聽器的情況下觸發?** – 2011-06-15 12:56:27

回答

17

getListView().setOnScrollListener(this)對於將聽衆綁定到ListView是必要的。 ListActivity類沒有提供綁定大部分監聽器的「自動」方式,它只提供了一種自動綁定OnItemClickListener的方法。檢查出ListActivity code

-4

你錯過了在onScroll()onScrollStateChanged()方法@Override符號。

+0

@Override不會被編譯爲字節碼。它只是表明你*意圖*重寫某些內容,所以編譯器可以告訴你,如果你沒有。 – dmon 2011-06-15 12:33:55

+0

@dmon請看這個問題,看看爲什麼它需要爲了方法被稱爲(涉及Android和活動)http://stackoverflow.com/questions/2950074/android-override-usage – Andre 2011-06-15 12:38:09

+0

也許*你*應該重新閱讀這個答案,這正是我評論你的答案。 – dmon 2011-06-15 12:49:56

1

如果您將onScroll簽名更改爲public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount),它會被調用嗎?通過添加final限定符,您已更改方法簽名,這將導致您的重寫方法不被看到。將visibleCount int複製到新的(final)int中,以便可以在線程中訪問它。

1
import android.widget.AbsListView.OnScrollListener; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test); 

     ListView listview=(ListView)findViewById(android.R.id.list); 
     listview.setAdapter(adapter); 
     listview.setOnScrollListener(onLstScroll);  
} 


OnScrollListener onLstScroll= new OnScrollListener() 
{ 
    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
    { 
     //Do something 
    } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) 
    { 
     //Do something 
    } 
};