1. <source id="nejs2"></source>
  2. <video id="nejs2"></video>
    <source id="nejs2"></source>
          1. 首頁 > 安卓筆記 > 提高Android應用性能的關鍵——Recycler視圖

            提高Android應用性能的關鍵——Recycler視圖

            更新:

            一、Recycler視圖的作用

            Recycler視圖是用于顯示大量數據的一種高性能列表視圖,在Android應用中得到廣泛應用。它的作用是管理列表項并在需要時刷新列表視圖中的內容。

            相比較于ListView,Recycler視圖的優勢在于:

            1. Recycler 視圖使用 ViewHolder 機制來緩存視圖對象,重用列表項視圖,減少內存使用。
            2. Recycler 視圖使用 LayoutManager 來控制列表項視圖的布局,使得 RecyclerView 可以很方便地支持橫向、縱向、瀑布流以及自定義布局等。
            3. 支持數據源發生變化時的動畫效果。

            接下來,我們將進一步了解 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 的高性能也帶來了一些問題,其中最常見的問題是滑動時的卡頓。造成這個問題的原因是在滑動過程中快速刷新視圖導致的。

            為了解決這個問題,我們可以采取以下措施:

            1. 緩存視圖 ,重用列表項視圖,減少內存使用。
            2. 使用 DiffUtil 對數據源進行比較,僅更新變化的部分視圖。

            2. RecyclerView中的動畫效果

            當數據源發生變化時,為了保證視圖能夠平滑地過渡,我們可以添加動畫效果,使得變化更明顯。

            RecyclerView 支持以下兩種動畫類型。

            1. notifyItemInserted(int position):在position位置插入新的數據項時,會有一個動畫效果,這個效果會從下往上彈出一個新的條目。
            2. 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;
                    }
                }
            }
            
            文章目錄
            頂部 久久久久99精品成人片毛片_黃色A片三級三級三級无码_日本不卡高清视频v中文字幕_高清欧美视频一区二区
            1. <source id="nejs2"></source>
            2. <video id="nejs2"></video>
              <source id="nejs2"></source>