安卓進階系列-05列表控件(RecyclerView)的使用

RecyclerView的使用

  • 前言
    • 在之前的博客中我介紹了ListView如何使用,當然那部分博客由於沒有考慮基礎的問題,寫的跨度太大,後面我會全部重構的。
    • ListView是一個滑動列表控件,隨着手指的滑動,讓屏幕外的內容到達屏幕內,屏幕內的內容移除屏幕區域,一度被認爲這是最常用也最難用的控件。(焦點、高度等問題層出不窮)但是,ListView有幾個致命的弊端,尤其的就是運行效率了,可能小項目還看不出來,但是填充數據大的時候,ListView的劣勢就體現出來了。
    • 當然,在之前,我們選擇兩種主要手段提高效率。(即使用convertView代替getView(),建立內部類ViewHolder緩存控件示例,避免重複控件綁定)
  • 背景
    • 爲了方便用戶的使用,拜託ListView的限制(只能縱向延伸),官方新增了控件RecyclerView,它被放在support庫中,所以使用需要添加依賴如下.
      • implementation 'com.android.support:recyclerview-v7:27.1.1'
    • 相比於ListView它優化了效率,且支持橫向滾動和瀑布流佈局。還有很多優點可以查看官方文檔。
  • 使用
    • 佈局中加入:編輯默認生成的activity_main.xml如下,添加控件如下
      • <android.support.v7.widget.RecyclerView
      • android:id="@+id/recycler_view"
      • android:layout_width="match_parent"
      • android:layout_height="match_parent">
      • </android.support.v7.widget.RecyclerView>
    • 創建適配器:創建java文件MyRecycleViewAdapter.java
      • package com.zc.testforrecyclerview;
        
        import android.support.annotation.NonNull;
        import android.support.v7.widget.RecyclerView;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.TextView;
        import android.widget.Toast;
        
        import java.util.List;
        
        public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
            private List<String> mData;
            static class ViewHolder extends RecyclerView.ViewHolder{
                View myView;
                TextView content;
                public ViewHolder(View view){
                    super(view);
                    myView = view;
                    content = view.findViewById(R.id.content);
                }
            }
        
            public MyRecyclerViewAdapter(List<String> Data){
                mData = Data;
            }
        
            @NonNull
            @Override
            public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.content, null, false);
                final ViewHolder holder = new ViewHolder(view);
                holder.myView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        int position = holder.getAdapterPosition();
                        String str = mData.get(position);
                        Toast.makeText(view.getContext(), "你點擊了第"+Integer.toString(position)+"項", Toast.LENGTH_LONG).show();
                    }
                });
                return holder;
            }
        
            @Override
            public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
                String name = mData.get(position);
                holder.content.setText(name);
            }
        
            @Override
            public int getItemCount() {
                return mData.size();
            }
        }
        

         

    • 註冊點擊事件
      • 很遺憾,RecyclerView沒有提供類似ListView那樣的setOnItemClickListener的方法,當然這不是沒寫,而是ListView註冊事件不是很人性化,它註冊的是子項事件但是當我想要點擊子項中的某個控件就有很多焦點問題,處理比較麻煩,RecyclerView沒有這個問題,他的點擊事件寫在適配器中。
      • 見上面代碼。
    • 運行結果
  • 補充說明
    • 參考書《第一行代碼》
    • 具體項目完整代碼見我的GitHub,上層目錄也有Kotlin代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章