RecycleView的出現(xiàn),其靈活的展現(xiàn)方式,可以說能夠完全替代ListView和GridView。
講RecycleView和ListView作一個簡單的對比:
1.RecycleView的適配器中,我們不需要再去判斷contentView,以及為了優(yōu)化性能而去對viewHolder進(jìn)行setTag綁定。RecycleView的Adapter對Viewholder進(jìn)行了封裝處理,讓開發(fā)者只關(guān)注于item的處理。
2.RecycleView可以設(shè)置列表的展示方向,可以輕松的實(shí)現(xiàn)橫向列表功能,這需要我們?yōu)镽ecycleView進(jìn)行setLayoutManager(),傳入?yún)?shù)為
? ? a.LinearLayoutManager:線性布局管理器
? ? b.StaggeredGridLayoutManager: 錯列網(wǎng)格布局管理器 ?(瀑布流)
? ? c.GridLayoutManager:網(wǎng)格布局管理器
3.列表分割線需手動添加,可以使用默認(rèn)風(fēng)格,也可以自定義分割線;自定義的分割線可以是圖片,也可以是xml樣式
4.自動增刪功能以及動畫效果
5.唯一苦逼的是,item的點(diǎn)擊事件需要開發(fā)者自己去實(shí)現(xiàn)
代碼如下:
1.RecycleView的配置
/控制其顯示的方式,請通過布局管理器LayoutManager
LinearLayoutManager linearLayoutManager =new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//控制Item間的間隔(可繪制),請通過ItemDecoration
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
//控制Item增刪的動畫,請通過ItemAnimator
recyclerView.setItemAnimator(new DefaultItemAnimator());
customAdapter =new CustomAdapter(this, list);
recyclerView.setAdapter(customAdapter);
//控制點(diǎn)擊、長按事件,對不起,自己Mark接口回調(diào)
customAdapter.setmOnItemClickListenter(new OnItemClickCallback() {
????@Override
? ? public void onItemClick(int position) {
????????????Toast.makeText(MainActivity.this,"點(diǎn)擊了條目",Toast.LENGTH_LONG).show();
????}
????@Override
? ? public void onLongItemClick(int position) {
????????????//控制Item的增刪,對不起,也是自己Mark
? ? ? ? ????customAdapter.removeItem(position);
????}
});
2.item點(diǎn)擊監(jiān)聽接口
????public interface OnItemClickCallback {
????????void onItemClick(int position);
????????void onLongItemClick(int position);
????}
3.adapter的設(shè)置
? ? 1.item布局文件綁定到繼承RecyclerView.ViewHolder的自定義的ViewHolder
????????public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
????????????View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_recycleview, parent,false);
????????????ViewHolder holder =new ViewHolder(itemView);
????????????return holder;
????????}
? ? 2.item數(shù)據(jù)展示以及點(diǎn)擊事件處理
? ??????@Override
????????public void onBindViewHolder(ViewHolder holder,final int position) {
????????????holder.tv.setText(mData.get(position));
????????????if (mOnItemClickCallback !=null){
????????????????????holder.itemView.setOnClickListener(new View.OnClickListener() {
????????????????????????@Override
? ? ? ? ? ? ????????????public void onClick(View v) {
????????????????????????????????mOnItemClickCallback.onItemClick(position);
????????????????????}
????????????});
????????????holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
????????????????????@Override
? ? ? ? ? ? ????????public boolean onLongClick(View v) {
????????????????????????mOnItemClickCallback.onLongItemClick(position);
????????????????????????return false;
????????????????????}
????????????});
? ? ? ? }
????}
3.自定義ViewHolder
? ??????class ViewHolderextends RecyclerView.ViewHolder{
????????????????private TextViewtv;
????????????????public ViewHolder(View itemView) {
????????????????????super(itemView);
????????????????????tv = itemView.findViewById(R.id.tv_str);
????????????????}
? ? ? ? ? }