RecyclerView是Google於5.0後新推出的控件,用於替代ListView,在ListView中convertView是複用的,而在RecyclerView中,是緩存的ViewHolder對象,因此在RecyclerView中有一個onCreateViewHolder方法,將itemView傳遞給每一個建立的ViewHolder,在ViewHolder中獲取itemView上的每一個View並做爲其成員。經過onBindViewHolder中viewHolder獲得要操做的view。緩存
經過recyclerView.setLayoutManager()來設置要顯示的列表類型,如今有三種:ide
1. LinearbyLayoutManager性能
2. GridLayoutManagerthis
3. StaggeredGridLayoutManager 瀑布流spa
recyclerView.setHasFixedSize(true); 設置每一個Item高度一致,可提升性能code
recyclerView的Adapter需繼承RecyclerView.Adapter,實現 onCreateViewHolder、onBindViewHolder和getItemCount方法。對象
並建立ViewHolder 繼承 RecyclerView.ViewHolder,將其做爲泛型類型傳遞給RecyclerView.Adapter的<>中。blog
onCreateViewHolder 獲取ItemView,建立ViewHolder時做爲參數傳遞出去。繼承
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); view.setOnClickListener(this); return new ViewHolder(view); }
ViewHolder獲得itemView後,獲取其子控件,做爲成員屬性。外部經過viewHolder獲得itemView下全部控件再作操做。接口
public static class ViewHolder extends RecyclerView.ViewHolder{ private TextView mTextView; public ViewHolder(View v){ super(v); mTextView = (TextView)v.findViewById(R.id.item_tv); if (flag){ mTextView.setHeight(200); }else{ mTextView.setHeight(280); } flag=!flag; } public TextView getmTextView() { return mTextView; } }
onBindViewHolder 獲取到viewHolder,對其內部view填充數據等操做。
public void onBindViewHolder(ViewHolder holder, int position) { holder.getmTextView().setText(dataset.get(position)); holder.getmTextView().setTag(dataset.get(position)); }
關於RecyclerView的點擊事件處理:
自定義一個點擊事件處理的接口,定義其實現的方法傳遞兩個參數(view, data)。向外部暴露一個set方法用於傳遞這個接口的實現,在viewHolder或者onCreateViewHolder將設置itemView的onClick事件,將事件的處理交給從外部傳遞過來的自定義的點擊事件。
添加數據:adapter.notifyItemInsered();
刪除數據:adapter.notifyItemRemove();