为啥 ListView onScroll() 被多次调用,每次都使用相同的参数量?

Posted

技术标签:

【中文标题】为啥 ListView onScroll() 被多次调用,每次都使用相同的参数量?【英文标题】:Why ListView onScroll() gets called mutiple times and everytime WITH SAME ARGUMENT AMOUNTS?为什么 ListView onScroll() 被多次调用,每次都使用相同的参数量? 【发布时间】:2014-09-03 00:31:28 【问题描述】:

我调试了好几次。这让我疯狂。 我的 listView.onScroll() 函数被多次调用,每次参数都为 0! 这会导致 listView 在滚动时一遍又一遍地显示相同的列表。

我什至手动设置了参数,但仍然没有改变。

到底为什么 onScroll 会被多次调用?

它不会因为有时结果出现在屏幕上而陷入循环!

我调用一个具有分页功能的 RESTfull webService。 这是我的 listView 片段中的一段代码。如果需要其他任何部分,请给我评论,我会补充。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        View rootView = inflater.inflate(R.layout.fragment_search_result_list, container, false);
        list=(ListView)rootView.findViewById(R.id.listViewSearchResult);
        list.setOnItemClickListener((OnItemClickListener) getActivity());


        list.setOnScrollListener(new OnScrollListener()

               @Override
               public void onScrollStateChanged(AbsListView view, int scrollState) 

               @Override
               public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
                   pagination = new Pagination(firstVisibleItem+visibleItemCount,visibleItemCount);
                   int lastInScreen = firstVisibleItem + visibleItemCount;    
                   if((lastInScreen == totalItemCount) && !(loadingMore))     
                       //grabURL(url);
                       new JSONParse(getActivity()).execute(url);
                   
                   if (firstVisibleItem==0) 
                       totalItemCount = 5;

               
              );
        return rootView;
    
    //*********************************** inner class
    public class JSONParse extends AsyncTask<String, String, JSONObject> 
        private ProgressDialog pDialog;
        private SearchResultArrayListAdaptor adapter;
        Context mContext;
        int checkBoxRooms;
        public JSONParse(Context context)
            mContext = context;
        
        @Override
        protected void onPreExecute() 
            super.onPreExecute();
        
        @Override
        protected JSONObject doInBackground(String... args) 
            //vvvv
            loadingMore = true;
            JSONObject json = null;
            PropertyFilter searchFilter = SearchFilterManager.initializePropertyFilter(new PropertyFilter(), getArguments());
            JSONParser jParser = new JSONParser();
            if (pagination.getPageSize()==0)
                pagination.setPageSize(5);
            json = jParser.getJSONFromUrl(url, searchFilter, pagination);
            return json;
        
        @Override
        protected void onPostExecute(JSONObject json) 

            loadingMore = false;
            PropertyObject propertyObject;
            ArrayList<PropertyObject> arrayList = new ArrayList<PropertyObject>();
            try 
                jsonArray = json.getJSONArray("PropertyListings");
                if (jsonArray == null || jsonArray.length()<1) 
                    return;
                for(int i = 0; i < jsonArray.length(); i++)
                    JSONObject c = jsonArray.getJSONObject(i);
                    propertyObject = new Gson().fromJson(c.toString(), new PropertyObject().getClass());
                    arrayList.add(propertyObject);
                
                adapter = new SearchResultArrayListAdaptor(getActivity(), R.layout.list_view_items, arrayList);
                list.setAdapter(adapter);

             
            catch (JSONException e) 
              e.printStackTrace();
            

【问题讨论】:

【参考方案1】:

来自developer's site关于AbsListView.OnScrollListener

在滚动列表视图或网格视图时调用的回调方法。如果视图正在滚动,该方法将在滚动的下一帧渲染之前调用。特别是,它将在任何对 getView(int, View, ViewGroup) 的调用之前调用。

回调将在每一帧中调用。所以使用这种方法不是一个好主意。

或者,您可以在列表视图中实现自定义适配器,并在其 getView() 方法中检查 position 变量是否指向列表中的最后一项。如果是,请提出请求。

【讨论】:

感谢您的回复。我会测试它并通知你。但是争论呢?为什么使用相同的参数值调用该方法?当我向下滚动时,同一个列表会一遍又一遍地出现在列表中。我调试了几次。是 onScroll 调用者给出了错误的值。但是我该如何解决呢?你知道是 android 调用它,而不是我 如果我照你说的做,它不会陷入死循环吗?为最后一个项目调用 getView,我加载新项目,所有这些项目都调用 getView,当为新添加的最后一个项目调用它时,整个故事将重新开始。

以上是关于为啥 ListView onScroll() 被多次调用,每次都使用相同的参数量?的主要内容,如果未能解决你的问题,请参考以下文章

ListView 自定义适配器对错误的项 OnScroll 应用操作

在android listview中使用onScroll

检测ListView何时到达底部 - onScroll()或onScrollStateChanged()?

在 RecyclerView/ListView onScroll 上隐藏 ActionBar

antd-mobile的ListView组件踩坑

onScrollListener的实现,用于检测ListView中滚动的结束