ListView的onScroll没有作用

发布于 2022-09-02 11:36:59 字数 5722 浏览 22 评论 0

最近我仿照知乎日报做一个app,我在使用ListView实现上拉加载更多数据的时候,ListView的onScroll没有作用。
onScroll的方法内用log打印信息,只有在ListView刚创建的时候能打印出信息,ListView创建完成后,滑动屏幕,没有任何效果。
我甚至为ListView添加onItemClickListener也没有任何效果。我怀疑是ListView没有获得焦点导致的。然后在网上查找资料,尝试给ListView设置setFocusable() 和setFocusableInTouchMode()方法以及添加 android:descendantFocusability 标签也没有任何作用。

下面是大致的代码:
ListView是放在一个Fragment里面显示的,且ListView的父容器是一个SwipeRefreshLayout。

Fragment所在Activity的布局是一个DrawerLayout:
xml文件里面的Fragment是Android侧边栏的模块。ListView所在的Fragment是放在news_main.xml的linerlayout里面的

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <include layout="@layout/news_main" />
    <fragment
        android:name="cc.hqu.sends.myzhihudaily.ui.fragment.MenuFragment"
        android:id="@+id/menu_fragment"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        tools:layout="@layout/menu_item" />
</android.support.v4.widget.DrawerLayout>

SwipeRefreshLayout布局:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/news_refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ListView
        android:id="@+id/news_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>

ListView里面的item只有TextView和ImageView。
ListView所在的Fragment的代码如下

public class NewsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{
    private ListView mListView;
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private String url;
    private ParseNews mParseNews;
    private Calendar date;
    private SimpleDateFormat mDateFormat;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.news_list, null);

        mListView = (ListView) view.findViewById(R.id.news_lv);

        mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.news_refresh);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        if ((url = getArguments().getString("url")) == null) {
            url = Constants.URL.ZHIHU_DAILY_NEWS_LASTEST;
        }

        // mListView.setAdapter(new NewsAdapter(this, mListView, new ParseNews(Constants.URL.ZHIHU_DAILY_NEWS_LASTEST).getNews()));
        mParseNews = new ParseNews(getActivity(), url, mListView, mSwipeRefreshLayout, true);
        mParseNews.execute();
        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            
                Log.d("tab", "onScroll");
                
            }
        });
        //获得日期
        mDateFormat = new SimpleDateFormat("yyyyMMdd");
        date = Calendar.getInstance();
        date.setTime(new Date());
        return view;
    }

    @Override
    public void onRefresh() {
        new ParseNews(getActivity(), url, mListView, mSwipeRefreshLayout).execute();
    }



}

ListView还设置了ViewPager做图片轮播头部:
ViewPager的item也只有TextView和ImageView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v4.view.ViewPager
        android:id="@+id/main_header_vp"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>

    <LinearLayout
        android:id="@+id/main_header_dots"
        android:layout_alignBottom="@id/main_header_vp"
        android:padding="5dp"
        android:gravity="center"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</RelativeLayout>

ViewPager的OnPageChangeListener只是设置图片自动播放:


    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        //页面滚动完成后,刷新轮播指示器

        dots.get((position - 1 + pageLength) % pageLength).setImageResource(R.drawable.dot_blur);
        dots.get(position % pageLength).setImageResource(R.drawable.dot_focus);
        dots.get((position + 1) % pageLength).setImageResource(R.drawable.dot_blur);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        switch (state) {
            case ViewPager.SCROLL_STATE_IDLE:
                mRefreshLayout.setEnabled(true);

                break;
            case ViewPager.SCROLL_STATE_DRAGGING:
                mRefreshLayout.setEnabled(false);
                resetHeaderTimer();
                break;
            case ViewPager.SCROLL_STATE_SETTLING:
                mRefreshLayout.setEnabled(true);

        }
    }

最后,我还尝试把ListView的头部和activity里面的侧边栏删除,依然没有任何效果。
刚学习Android没多久就遇到这么一个问题,希望能够解答。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陪你搞怪i 2022-09-09 11:36:59

应该是ListView的适配器把你的滑动事件给拦截了,你让你的ListView适配器同时去实现AbsListView.OnScrollListener,在然后再
ListView.setAdapter(adapter);
ListView.setOnScrollListener(adapter);
试试这样行不行。

毁梦 2022-09-09 11:36:59

你没有为mListView设置适配器,没有数据item如何滑动与点击
mListView.setAdapter(xxx);//xxx adapter

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文