在Android中,實現ItemList的分頁加載可以通過以下幾個步驟來完成:
創建一個用于顯示數據的RecyclerView和一個用于加載更多數據的ProgressBar。
為RecyclerView設置一個LinearLayoutManager,并使用setReverseLayout(true)和setStackFromEnd(true)方法將列表反轉,這樣新加載的數據會顯示在列表的頂部。
創建一個自定義的Adapter,繼承自RecyclerView.Adapter,并重寫其中的方法。在Adapter中,需要一個用于存儲數據的ArrayList,并在其中添加一個表示正在加載更多數據的標志。
在Adapter的onCreateViewHolder方法中,根據不同的viewType創建不同的ViewHolder。其中,一種類型用于顯示數據項,另一種類型用于顯示正在加載更多數據的ProgressBar。
在Adapter的onBindViewHolder方法中,根據不同的viewType綁定不同的數據。對于數據項,需要將數據綁定到對應的View上;對于正在加載更多數據的ProgressBar,需要根據是否正在加載更多數據來顯示或隱藏它。
為RecyclerView設置一個滾動監聽器,繼承自RecyclerView.OnScrollListener。在其中的onScrolled方法中,判斷當前滾動位置是否接近列表底部,如果是,則開始加載更多數據。
在加載更多數據時,需要將正在加載更多數據的標志設置為true,并通知Adapter更新數據。加載完數據后,將數據添加到ArrayList中,并將正在加載更多數據的標志設置為false,然后再次通知Adapter更新數據。
下面是一個簡單的示例代碼:
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private ProgressBar mProgressBar;
private MyAdapter mAdapter;
private ArrayList<String> mDataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler_view);
mProgressBar = findViewById(R.id.progress_bar);
mAdapter = new MyAdapter(mDataList);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (!mAdapter.isLoading() && layoutManager.findLastVisibleItemPosition() == mDataList.size() - 1) {
loadMoreData();
}
}
});
loadMoreData();
}
private void loadMoreData() {
mAdapter.setLoading(true);
mAdapter.notifyDataSetChanged();
// 模擬加載數據
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
mDataList.add("Item " + (mDataList.size() + 1));
}
mAdapter.setLoading(false);
mAdapter.notifyDataSetChanged();
}
}, 2000);
}
}
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_ITEM = 0;
private static final int TYPE_LOADING = 1;
private ArrayList<String> mDataList;
private boolean mIsLoading;
public MyAdapter(ArrayList<String> dataList) {
mDataList = dataList;
}
@Override
public int getItemViewType(int position) {
return mIsLoading && position == mDataList.size() ? TYPE_LOADING : TYPE_ITEM;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) {
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
return new ItemViewHolder(view);
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_item, parent, false);
return new LoadingViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
((ItemViewHolder) holder).textView.setText(mDataList.get(position));
} else if (holder instanceof LoadingViewHolder) {
((LoadingViewHolder) holder).progressBar.setVisibility(mIsLoading ? View.VISIBLE : View.GONE);
}
}
@Override
public int getItemCount() {
return mDataList.size() + (mIsLoading ? 1 : 0);
}
public void setLoading(boolean isLoading) {
mIsLoading = isLoading;
}
public boolean isLoading() {
return mIsLoading;
}
private static class ItemViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(android.R.id.text1);
}
}
private static class LoadingViewHolder extends RecyclerView.ViewHolder {
ProgressBar progressBar;
public LoadingViewHolder(@NonNull View itemView) {
super(itemView);
progressBar = itemView.findViewById(R.id.progress_bar);
}
}
}
這個示例代碼中,我們創建了一個簡單的RecyclerView,用于顯示字符串列表。當滾動到列表底部時,會自動加載更多數據。