我正在尝试使用recyclerview中列出的cardview构建新闻提要。问题是,当我通过滚动加载更多数据时,它会自动滚动到页面顶部。我想知道如何防止这种情况。
我已覆盖onScrolled
的{{1}}的{{1}}方法来加载更多数据。我每次使用Recyclerview
函数将新数据添加到Arraylist中。然后,我调用onScrollListener
函数以使用更新后的Arraylist设置fetchingJSON()
。
因此,假设我在开始时加载了4条新闻,然后滚动到页面底部并又加载了4条新闻。它只是将新数据添加到Arraylist中,并重新创建了setupRecycler()
。我认为这就是为什么一开始安装8个新闻并没有太大区别的原因,但是我不知道该怎么做才能避免这种情况。
Recyclerview
然后在fetchingJSON()函数中,我正在调用parseJSONData函数来解析响应。 我不在onResponse中这样做,因为凌空的异步操作会引起一些问题
recyclerview
在parseJSONData函数中;我从JSON响应中获取数据,并以此设置对象的属性。比将我的对象添加到Arraylist中。最后,我调用setupRecycler函数以使用更新的数据重新创建我的Recyclerview。
/*Here I am controlling if user has reached to bottom of page, and calling fetchingJSON() function.*/
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visibleItemCount = lManager.getChildCount();
int totalItemCount = lManager.getItemCount();
int firstVisibleItemPosition = lManager.findFirstVisibleItemPosition();
if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount
&& firstVisibleItemPosition >= 0
&& totalItemCount >= PAGE_SIZE && !isLoading) {
newsFeed.this.postPage++;
fetchingJSON();
}
}
});
private void fetchingJSON() {
isLoading = true;
String url = getResources().getString(R.string.haberUrl);
StringRequest jsonStringRequest = new StringRequest(
Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
parseJSONData(response);
}
},
new Response.ErrorListener() {
@Override
.
.
.
答案 0 :(得分:1)
如果rvAdapter
不为空,则向其中添加项目并调用notifyItemRangeInserted()
而不是创建新适配器:
for (int i = 0; i < dataArray.length(); i++) {
JSONObject dataobj = dataArray.getJSONObject(i);
haberModel1.setTitle(dataobj.getString("header"));
haberModel1.setUrl(dataobj.getString("picture"));
haberModel1.setId(dataobj.getString("id"));
haberModelArrayList.add(haberModel1);
// remove line: setupRecycler();
}
// Add these lines
if (rvAdapter != null){
int itemCount = rvAdapter.getItemCount();
// TODO: add method setItems() to your adapter
rvAdapter.setItems(haberModelArrayList);
rvAdapter.notifyItemRangeInserted(itemCount, dataArray.length());
} else {
setupRecycler();
}