listview的onScroll事件没有触发

7

我正在开发一个应用程序,需要显示一些列表视图控件。我正在在我的活动中实现OnScrollListener,以便监视我的列表视图内容,但是当我设置我的活动布局时,它没有调用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
是的。如果我省略了getListView().setOnScrollListener(this),它就不会被触发。 - ram
没错,如果你省略监听器(listener),它将不会触发。那么问题来了,你真的想在没有设置监听器的情况下触发事件吗?! - Labeeb Panampullan
4个回答

17

getListView().setOnScrollListener(this)是必要的操作,将监听器绑定到ListView中。 ListActivity类没有提供“自动”绑定大多数监听器的方式,它只提供了一种自动绑定OnItemClickListener的方式。请查看ListActivity代码


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

1
如果您将onScroll签名更改为public void onScroll(AbsListView view,int firstVisible,int visibleCount,int totalCount),它会被调用吗?通过添加final限定符,您已更改了方法签名,这将导致您重写的方法不可见。将visibleCount int复制到新的(final)int中,以便您可以在线程中访问它。

-4

你的 onScroll()onScrollStateChanged() 方法上缺少 @Override 注解。


@Override 不会被编译成字节码。它只是声明你打算覆盖某些东西,这样编译器就可以告诉你是否没有实现。 - dmon
@dmon 请查看此问题以了解为什么需要重写方法才能调用(与Android和Activities有关)https://dev59.com/4HA85IYBdhLWcg3wF_YO - Andre
也许应该重新阅读那个答案,它恰好阐述了我对你的回答的评论。 - dmon
@dmon -- 如果题主包含了 @Override 注解,编译器会告诉他实际上他并没有重写方法,因为他通过添加 final 修饰符改变了原始方法的签名。虽然没有明确解释原因,但 Andre 的回答是有效和有帮助的。 - mah
@mah 最终结果不是问题。OnScrollListener是一个接口,如果他没有正确地重写方法,代码根本无法编译。 - dmon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接