当我加载更多数据时,如何防止 recyclerview 滚动启动
How can i prevent recyclerview scrolling to start when i load more data
我正在尝试使用 recyclerview 中列出的卡片视图来构建新闻提要。问题是,当我通过滚动加载更多数据时,它会自动滚动到页面顶部。我想知道如何防止这种情况。
我已经覆盖了 Recyclerview
的 onScrollListener
的 onScrolled
方法以加载更多数据。我每次都使用 fetchingJSON()
函数向 Arraylist 添加新数据。然后我调用 setupRecycler()
函数以使用我更新的 Arraylist 设置 Recyclerview
。
假设我一开始加载了 4 条新闻,然后我滚动到页面底部并加载了另外 4 条新闻。它只是将新数据添加到 Arraylist 并重新创建 recyclerview
。我认为这就是为什么在 first.But 安装 8 个新闻没有太大区别我不知道该怎么做才能避免这种情况。
/*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();
}
}
});
然后在 fetchingJSON() 函数中,我调用 parseJSONData 函数来解析响应。
我没有在onResponse中这样做,因为volley的异步操作会导致一些问题
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
.
.
.
在解析JSON数据函数中;我正在从 JSON 响应中获取数据,并以此设置对象的属性。比将我的对象添加到 Arraylist。最后,我正在调用 setupRecycler 函数以使用更新后的数据重新创建我的 Recyclerview。
public void parseJSONData(String response) {
try {
JSONObject obj = new JSONObject(response);
JSONArray dataArray = obj.getJSONArray("data");
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);
setupRecycler();
}
} catch (JSONException e) {
Log.d(""+TAG,e.printStackTrace() );
}
}
private void setupRecycler() {
lManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(lManager);
rvAdapter = new RvAdapter(this, haberModelArrayList);
recyclerView.setAdapter(rvAdapter);
isLoading = false;
}
如果 rvAdapter
是 non-null,则向其添加项目并调用 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();
}
我正在尝试使用 recyclerview 中列出的卡片视图来构建新闻提要。问题是,当我通过滚动加载更多数据时,它会自动滚动到页面顶部。我想知道如何防止这种情况。
我已经覆盖了 Recyclerview
的 onScrollListener
的 onScrolled
方法以加载更多数据。我每次都使用 fetchingJSON()
函数向 Arraylist 添加新数据。然后我调用 setupRecycler()
函数以使用我更新的 Arraylist 设置 Recyclerview
。
假设我一开始加载了 4 条新闻,然后我滚动到页面底部并加载了另外 4 条新闻。它只是将新数据添加到 Arraylist 并重新创建 recyclerview
。我认为这就是为什么在 first.But 安装 8 个新闻没有太大区别我不知道该怎么做才能避免这种情况。
/*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();
}
}
});
然后在 fetchingJSON() 函数中,我调用 parseJSONData 函数来解析响应。 我没有在onResponse中这样做,因为volley的异步操作会导致一些问题
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
.
.
.
在解析JSON数据函数中;我正在从 JSON 响应中获取数据,并以此设置对象的属性。比将我的对象添加到 Arraylist。最后,我正在调用 setupRecycler 函数以使用更新后的数据重新创建我的 Recyclerview。
public void parseJSONData(String response) {
try {
JSONObject obj = new JSONObject(response);
JSONArray dataArray = obj.getJSONArray("data");
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);
setupRecycler();
}
} catch (JSONException e) {
Log.d(""+TAG,e.printStackTrace() );
}
}
private void setupRecycler() {
lManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(lManager);
rvAdapter = new RvAdapter(this, haberModelArrayList);
recyclerView.setAdapter(rvAdapter);
isLoading = false;
}
如果 rvAdapter
是 non-null,则向其添加项目并调用 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();
}