2011-06-15 16 views
7

Estoy desarrollando una aplicación donde necesito mostrar un control de vista de lista. Solo estoy implementando el OnScrollListener en mi actividad para controlar el contenido de mi lista pero no invoca el evento onScroll cuando configuro mi actividad. Si comento ese bloque, lo invoca bien. ¿Cómo resuelvo este problema?evento onScroll no se activa para listview

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

I'm confused. ¿Quiso decir que si omite 'getListView(). SetOnScrollListener (this)', no funciona? – dmon

+0

Sí. Si omite el getListView(). SetOnScrollListener (esto) no se dispara. – ram

+0

Correcto, si omite oyente, no se disparará. ¿Cuál es el problema real, ** desea disparar sin configurar el oyente?! ** –

Respuesta

17

getListView().setOnScrollListener(this) es necesario vincular al oyente al ListView. La clase ListActivity no proporciona una forma "automática" de vincular a la mayoría de los oyentes, solo proporciona una forma automática de vincular el OnItemClickListener. Mira el ListActivity code.

-4

que se está perdiendo la notación @Override sobre los métodos onScroll() y onScrollStateChanged().

+0

@Override no se compila en código byte. Simplemente indica que * pretendió * anular algo, por lo que el compilador puede decirle si no lo hizo. – dmon

+0

@dmon Consulte esta pregunta para saber por qué es necesario para llamar al método (se refiere a Android y a Actividades) http://stackoverflow.com/questions/2950074/android-override-usage – Andre

+0

Quizás * usted * debería vuelve a leer esa respuesta, que dice exactamente lo que comenté en tu respuesta. – dmon

1

Si cambia su firma onScroll al public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) ¿se llamará? Al agregar el calificador final, ha cambiado la firma del método y esto hará que su método reemplazado no se vea. Copie el visibleCount int a un int nuevo (final) para que pueda acceder a él en su hilo.

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 
    } 
}; 
Cuestiones relacionadas