为啥 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 应用操作
检测ListView何时到达底部 - onScroll()或onScrollStateChanged()?