Android開發——RecyclerView特性以及基本使用方法(二)
阿新 • • 發佈:2019-01-10
0. 前言
隨著Android的發展,雖然ListView依舊重要,但RecyclerView確實越來越多的被大家使用。但顯然並不能說RecyclerView就一定優於ListView,而是應該根據不同的需求選擇最合適的進行使用。本篇將介紹我們為什麼要使用RecyclerView,並且它的基本使用方法。
1. RecyclerView的動畫效果和點選事件
系統沒有提供ClickListener和LongClickListener,不過我們也可以自己去新增,這裡通過adapter中自己去提供回撥的方式實現。
在Adapter中如下所示:
public OnItemClickListener itemClickListener; public void setOnItemClickListener(OnItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } public interface OnItemClickListener { void onItemClick(View view, int position); void onItemLongClick(View view, int position); } public class ViewHolder extends RecyclerView.ViewHolder{ public TextView textView; public ViewHolder(View itemView) { super(itemView); textView = (TextView)itemView.findViewById(R.id.id_num); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (itemClickListener != null) { itemClickListener.onItemClick(view, getPosition()); } } }); textView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if (itemClickListener != null) { itemClickListener.onItemLongClick(view, getPosition()); } return true; } }); } }
首先自行提供了點選和長按的介面,並在內部類ViewHolder中對點選事件進行了處理。
在Activity中的實現如下:
mAdapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() { @Override public void onItemClick(final View view, int position) { Toast.makeText(MainActivity.this, position + "", Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(View view, int position) { mAdapter.removeData(position); } });
這裡簡單的單擊事件,只是Toast了位置資訊,而在長按事件中,則呼叫了Adapter中的removeData()方法,notifyItemRemoved()方法則對該條目進行了刪除,而且是有動畫效果的。若有新增資料的需求,也是有對應的方法,即notifyItemInserted(position)。
public void removeData(int position) { mData.remove(position); notifyItemRemoved(position); } public void addData(int position) { mData.add(position, "Insert One"); notifyItemInserted(position); }
當然,需要為RecyclerView進行關於動畫的設定:
mRcList.setItemAnimator(newDefaultItemAnimator());