android - RecyclerView如何设置scrollToPositionWithOffset(x,y)?
问题描述
我有一个从 API 获取数据的 RecyclerView。我正在使用排球。我正在分批获取 20 个项目的数据。我希望使用线性布局管理器 myLLM.scrollToPositionWithOffset(x,y) 设置滚动位置,以便在获取下一批数据时,当前重置为顶部的滚动位置保留在上一批的最后一项。
为此,我需要在下面代码所示的位置添加以下代码行。
myLLM.scrollToPositionWithOffset(y,0);
但我不能这样做。请指导我如何实现这一目标。
public class ActivityItems extends AppCompatActivity {
private RecyclerView myRvItems;
private ItemsAdapter myItemsAdapter;
private ArrayList<ItemsModel> myItemsFeedList;
private RequestQueue myRequestQueue;
private ProgressBar itemsProgressBar;
Boolean isScrolling = false;
int currentItems, totalItems, scrolledOutItems, x = 0, y = (x + 20);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items);
getSupportActionBar().setTitle("Inventory Items");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
myRvItems = findViewById(R.id.rvItems);
itemsProgressBar = findViewById(R.id.pbItems);
final LinearLayoutManager myLLM = new LinearLayoutManager(this);
myRvItems.setLayoutManager(myLLM);
myItemsFeedList = new ArrayList<>();
myRequestQueue = Volley.newRequestQueue(this);
parseJSON();
myRvItems.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
isScrolling = true;
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentItems = myLLM.getChildCount();
totalItems = myLLM.getItemCount();
scrolledOutItems = myLLM.findFirstVisibleItemPosition();
if(isScrolling && (currentItems + scrolledOutItems == totalItems)){
isScrolling = false;
parseJSON();
myLLM.scrollToPositionWithOffset(4, 20);
}
}
});
}
private void parseJSON() {
itemsProgressBar.setVisibility(View.VISIBLE);
String url = "http://restapis.xyv.com/api/list";
JsonObjectRequest myRequest = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray myJSONArray = response.getJSONArray("Data");
for (int i = x; i < y && i < myJSONArray.length(); i++){
JSONObject myData = myJSONArray.getJSONObject(i);
String itemID = myData.getString("ItemID");
String itemName = myData.getString("ItemName");
String itemRackNo = myData.getString("RackNo");
myItemsFeedList.add(new ItemsModel(itemID,itemName,itemRackNo));
**// I WANT TO SET THE SCROLL POSITION HERE BUT THIS NOT WORKING**
**// myLLM.scrollToPositionWithOffset(y,0);**
}
myItemsAdapter = new ItemsAdapter(myItemsFeedList,ActivityItems.this );
myRvItems.setAdapter(myItemsAdapter);
itemsProgressBar.setVisibility(View.GONE);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
myRequestQueue.add(myRequest);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return super.onSupportNavigateUp();
}
}
解决方案
按照@mmmcho 的建议,问题得到了解决。“首先设置您的适配器,即使您的列表为空。获取数据时更新您的列表。然后调用 adapter.notifydatasetchanged() 方法。”
还有一种粗略的分页方式。因此,如果有人正在寻找最简单的 RecyclerView 分页,他也可以按照代码进行操作。(只需将您的 api 数据按日期排序,它会工作得最好。)
代码现在如下所示:
公共类 ActivityItems 扩展 AppCompatActivity {
private RecyclerView myRvItems;
private ItemsAdapter myItemsAdapter;
private ArrayList<ItemsModel> myItemsFeedList;
private RequestQueue myRequestQueue;
private ProgressBar itemsProgressBar;
Boolean isScrolling = false;
int currentItems, totalItems, scrolledOutItems, fetchSize = 6 , x = 0, y = (x + fetchSize);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items);
getSupportActionBar().setTitle("Inventory Items");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
myRvItems = findViewById(R.id.rvItems);
itemsProgressBar = findViewById(R.id.pbItems);
final LinearLayoutManager myLLM = new LinearLayoutManager(this);
myRvItems.setLayoutManager(myLLM);
myItemsFeedList = new ArrayList<>();
myItemsAdapter = new ItemsAdapter(myItemsFeedList,ActivityItems.this );
myRvItems.setAdapter(myItemsAdapter);
myRequestQueue = Volley.newRequestQueue(this);
parseJSON();
myRvItems.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
isScrolling = true;
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentItems = myLLM.getChildCount();
totalItems = myLLM.getItemCount();
scrolledOutItems = myLLM.findFirstVisibleItemPosition();
if(isScrolling && (currentItems + scrolledOutItems == totalItems)){
isScrolling = false;
y = x + fetchSize;
parseJSON();
}
}
});
}
private void parseJSON() {
itemsProgressBar.setVisibility(View.VISIBLE);
String url = "http://restapis.xyn.com/api/list";
JsonObjectRequest myRequest = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray myJSONArray = response.getJSONArray("Data");
for (int i = x; i < y && i < myJSONArray.length(); i++){
JSONObject myData = myJSONArray.getJSONObject(i);
String itemID = myData.getString("ItemID");
String itemName = myData.getString("ItemName");
String itemRackNo = myData.getString("RackNo");
myItemsFeedList.add(new ItemsModel(itemID,itemName,itemRackNo));
x = x+1;
}
myItemsAdapter.notifyDataSetChanged();
itemsProgressBar.setVisibility(View.GONE);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
myRequestQueue.add(myRequest);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return super.onSupportNavigateUp();
}}
推荐阅读
- google-sheets - 收集一个 Google 工作表中与另一工作表的列中的字符串匹配的行
- c++ - 如何为 C++ gRPC 客户端绑定网络接口
- laravel - production.ERROR:命名空间声明语句必须是第一个语句或脚本中的任何声明调用之后
- python - 在 python 中打开一个 .mat 图像文件
- python - k-means聚类后的时间序列求和
- delphi - 检查字符串是否为正则表达式的其他方法
- sql - 将 JSON 数据从 SQL DB 导入 R 数据框
- spring - 使用 DeadLetterPublishingRecoverer 发布 Json 反序列化错误不会发布原始有效负载
- php - 如何显示表单中的复选框值并显示为 pdf php?
- javascript - 通过 HTTPS 的 Web 套接字