一、Recycler視圖的作用
Recycler視圖是用於顯示大量數據的一種高性能列表視圖,在Android應用中得到廣泛應用。它的作用是管理列表項並在需要時刷新列表視圖中的內容。
相比較於ListView,Recycler視圖的優勢在於:
- Recycler 視圖使用 ViewHolder 機制來緩存視圖對象,重用列表項視圖,減少內存使用。
- Recycler 視圖使用 LayoutManager 來控制列表項視圖的布局,使得 RecyclerView 可以很方便地支持橫向、縱向、瀑布流以及自定義布局等。
- 支持數據源發生變化時的動畫效果。
接下來,我們將進一步了解 Recycler 視圖的使用方法和相關注意事項。
二、使用方法
1. 布局和ViewHolder定義
在創建Recycler視圖之前,我們需要先進行布局和ViewHolder的定義。與ListView相比,Recycler視圖的實現更複雜,但是使用典型的Recycler視圖的布局和ViewHolder的定義如下:
{@code
private class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tvTitle;
private TextView tvSubtitle;
public MyViewHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvSubtitle = (TextView) itemView.findViewById(R.id.tvSubtitle);
}
}
}
2. 實現Adapter
實現 Adapter 對象是必須的,即必須為列表視圖提供內容。ViewHolder 只是一個用來保存列表項視圖的對象,而 Adapter 是用來提供視圖數據的。
{@code
private class MyAdapter extends RecyclerView.Adapter {
private List mDataList;
public MyAdapter(List dataList) {
mDataList = dataList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
MyData data = mDataList.get(position);
holder.tvTitle.setText(data.getTitle());
holder.tvSubtitle.setText(data.getSubtitle());
}
@Override
public int getItemCount() {
return mDataList.size();
}
}
}
3. 設置LayoutManager和Adapter
一旦有布局、 ViewHolder 和 Adapter 就可以創建 Recycler 視圖了。首先設置 LayoutManager,再設置 Adapter。
{@code
private RecyclerView mRecyclerView;
private void initRecyclerView() {
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(new MyAdapter(getDataList()));
}
}
三、注意事項
1. RecyclerView性能問題
RecyclerView 的高性能也帶來了一些問題,其中最常見的問題是滑動時的卡頓。造成這個問題的原因是在滑動過程中快速刷新視圖導致的。
為了解決這個問題,我們可以採取以下措施:
- 緩存視圖 ,重用列表項視圖,減少內存使用。
- 使用 DiffUtil 對數據源進行比較,僅更新變化的部分視圖。
2. RecyclerView中的動畫效果
當數據源發生變化時,為了保證視圖能夠平滑地過渡,我們可以添加動畫效果,使得變化更明顯。
RecyclerView 支持以下兩種動畫類型。
- notifyItemInserted(int position):在position位置插入新的數據項時,會有一個動畫效果,這個效果會從下往上彈出一個新的條目。
- notifyItemRemoved(int position):從position位置移除一個數據項時,會有一個默認的動畫效果,被移除的數據項會從上往下一個條目消失。
四、完整代碼示例
1. 布局recycler_view_item.xml
{@code
}
2. Recycler視圖及Adapter設置方法
{@code
private void initRecyclerView() {
mRecyclerView = findViewById(R.id.recyclerView);
//設置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//設置adapter
mRecyclerView.setAdapter(new MyAdapter(getDataList()));
}
//Adapter實現
private class MyAdapter extends RecyclerView.Adapter {
private List mDataList;
public MyAdapter(List dataList) {
mDataList = dataList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
MyData data = mDataList.get(position);
holder.tvTitle.setText(data.getTitle());
holder.tvSubtitle.setText(data.getSubtitle());
}
@Override
public int getItemCount() {
return mDataList.size();
}
}
// ViewHolder實現
private class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tvTitle;
private TextView tvSubtitle;
public MyViewHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvSubtitle = (TextView) itemView.findViewById(R.id.tvSubtitle);
}
}
//列表數據源
private List getDataList() {
List dataList = new ArrayList();
for (int i = 0; i < 50; i++) {
dataList.add(new MyData("Title " + i, "Subtitle " + i));
}
return dataList;
}
//數據項
private class MyData {
private String mTitle;
private String mSubtitle;
public MyData(String title, String subtitle) {
mTitle = title;
mSubtitle = subtitle;
}
public String getTitle() {
return mTitle;
}
public String getSubtitle() {
return mSubtitle;
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/198128.html
微信掃一掃
支付寶掃一掃