【发布时间】:2023-03-22 19:03:02
【问题描述】:
我有一个从 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();
}
}
【问题讨论】:
-
如果没有先设置适配器,您将无法滚动到位置。另外,您正在将适配器设置为可能被多次调用的方法。这不是好的做法。首先设置您的适配器,即使您的列表为空。获取数据后更新您的列表。然后调用 adapter.notifydatasetchanged() 方法。然后您可以滚动到最后一个位置。让我知道这是否回答了您的问题,或者我是否必须回答
-
@mmmcho 非常感谢。如您所说,“首先设置您的适配器,即使您的列表为空。获取数据时更新您的列表。然后调用 adapter.notifyDataSetChanged() 方法。”现在 RecyclerVeiw 不会重置到顶部。所以也不需要设置滚动位置。良好的实践效果很好。再次感谢。
标签: android android-recyclerview scroll pagination linearlayoutmanager