![](/img/trans.png)
[英]RecyclerView scrollToPositionWithOffset with animation
[英]How to set the scrollToPositionWithOffset(x,y) of RecyclerView?
我有一個 RecyclerView 從 API 獲取數據。 我正在使用排球。 我正在分批獲取 20 個項目的數據。 我希望使用線性布局管理器 myLLM.scrollToPositionWithOffset(x,y) 設置滾動 position,以便在獲取下一批數據時,當前重置為頂部的滾動 position 保留在上一批的最后一項。
為此,我需要在下面代碼所示的位置添加以下代碼行。
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 數據按日期排序,效果最佳。)
代碼現在如下所示:
公共 class 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();
}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.