Android RecyclerView簡單實現及Adapter示例

RecyclerView也是用很久了,但一段時間不用之後還是會要各種查資料找用法,所以,還是有必要記錄一下它的基本用法。

RecyclerView,是官方在Android5.0推出的新組件,它集成在support-v7包中。RecyclerView並不是取代ListView的,各有側重,不過RecyclerView的出現,使大量數據的展示更爲方便和多樣化。比如橫向滾動,比如瀑布流佈局。OK,介紹就到這裏 ,下面進入它的簡單使用:

因爲RecyclerView是集成在support-v7包裏的,所以我們第一步就是導入:

implementation 'com.android.support:recyclerview-v7:28.0.0'

我這裏使用的版本比較高,各位可以根據自己的實際情況添加對應的v7包。

然後你就可以在佈局文件中添加RecyclerView控件了:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

Activity中初始化並生成簡單的數據,這裏需要主意一點的是,RecyclerView和ListView的用法還是有些區別的,RecyclerView需要設置佈局管理器以控制Item的佈局方式,比如橫向豎向以及瀑布流方式,這裏就不具體展開,大家有興趣可以自行去研究,我這裏就以普遍的LinearLayoutManager來做示範。

private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
//測試數據集合
private List<Map<String, Object>> datas = new ArrayList<>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notification_test);
        
    //準備測試數據
    for (int i=0;i<10;i++) {
      Map<String, Object> map = new HashMap<>();
      map.put("title", "萬曆十五年" + i);
      map.put("content", "在《萬曆十五年》一書中,黃仁宇用近乎平淡的筆觸分析一個皇朝從興盛走向衰頹的原因,而這些平淡的敘述自有力量,他淡然勾勒出的人生困境,即便是對歷史學不感興趣的讀者,也心有慼慼焉。");
      datas.add(map);
    }

    recyclerView = findViewById(R.id.recyclerview);
    linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(new TestAdapter(this, datas));
}

和ListView的使用基本差不多,同樣的設置Adapter,下面是Adapter的代碼:

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
        public class ViewHolder extends RecyclerView.ViewHolder {
            public TextView title;
            public TextView content;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.tv_title);
                content = itemView.findViewById(R.id.tv_content);
            }
        }
        private List<Map<String, Object>> mDatas;
        private final Context context;
        public TestAdapter(Context context, List<Map<String, Object>> mDatas) {
            this.context = context;
            this.mDatas = mDatas;
        }

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(context).inflate(R.layout.recyclerview_item,null);
            return new ViewHolder(view);
        }
        @Override
        public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
            viewHolder.title.setText(mDatas.get(i).get("title").toString());
            viewHolder.content.setText(mDatas.get(i).get("content").toString());
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "點擊"+mDatas.get(i).get("title").toString(), Toast.LENGTH_SHORT).show();
                }
            });
        }
        @Override
        public int getItemCount() {
            return mDatas.size();
        }
    }

可能大家都會注意到,這裏和ListView的Adapter還是有點區別的,具體說一下吧,首先,RecyclerView的Adapter繼承的是RecyclerView.Adapter,並且泛型添加ViewHolder,此處ViewHolder直接實現在Adapter裏。然後在onCreateViewHolder裏通過

LayoutInflater.from(context).inflate(R.layout.recyclerview_item,null);

得到具體項的佈局view,最後返回的是這個view的ViewHolder。在onBindViewHolder裏,我們可以設置各項組件所顯示的內容並且設置點擊事件,我這裏設置的是itemView的點擊事件,就是點擊這一項都會有響應,你也可以直接設置某一個控件的點擊事件,具體方法是一樣的。

好了,相對來說比較簡單,因爲和ListView的用法雖然有點出入,但還是大同小異的,只是要注意那些不一樣的地方。下面上效果圖:

暫時只關注功能實現哈,界面什麼的,各位都是大牛。不過有細心的讀者可能會發現問題,爲什麼項與項之間沒有任何分隔,是的,RecyclerView默認沒有分隔線,並不是說沒有這個功能 ,相反,RecyclerView還把這個功能實現的非常好,讓你可以自定義分隔線,不過這裏就不展開講,我們通過一個最簡單的方式添加一根默認的分隔線:

recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

ok,就添加這一句話 ,我們就實現了分隔線的功能,看效果:

OK,打完收工。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章