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,打完收工。