亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android5.0新控件——RecyclerView的使用全解

2019-11-09 17:33:39
字體:
來源:轉載
供稿:網友

介紹

RecyclerView與ListView原理是類似的:都是僅僅維護少量的View并且可以展示大量的數據集。RecyclerView用以下兩種方式簡化了數據的展示和處理:

使用LayoutManager來確定每一個item的排列方式。 為增加和刪除項目提供默認的動畫效果。 你也可以定義你自己的LayoutManager和添加刪除動畫,RecyclerView項目結構如下: 這里寫圖片描述

Adapter:使用RecyclerView之前,你需要一個繼承自RecyclerView.Adapter的適配器,作用是將數據與每一個item的界面進行綁定。 LayoutManager:用來確定每一個item如何進行排列擺放,何時展示和隱藏?;厥栈蛑赜靡粋€View的時候,LayoutManager會向適配器請求新的數據來替換舊的數據,這種機制避免了創建過多的View和頻繁的調用findViewById方法(與ListView原理類似)。

目前SDK中提供了三種自帶的LayoutManager:

LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager

recyclerView = (RecyclerView) findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(this ); //設置布局管理器 recyclerView.setLayoutManager(layoutManager); //設置為垂直布局,這也是默認的 layoutManager.setOrientation(OrientationHelper. VERTICAL); //設置Adapter recyclerView.setAdapter( recycleAdapter); //設置分隔線 recyclerView.addItemDecoration( new DividerGridItemDecoration(this )); //設置增加或刪除條目的動畫 recyclerView.setItemAnimator( new DefaultItemAnimator());

①onCreateViewHolder() 這個方法主要生成為每個Item inflater出一個View,但是該方法返回的是一個ViewHolder。該方法把View直接封裝在ViewHolder中,然后我們面向的是ViewHolder這個實例,當然這個ViewHolder需要我們自己去編寫。直接省去了當初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟。

②onBindViewHolder() 這個方法主要用于適配渲染數據到View中。方法提供給你了一個viewHolder,而不是原來的convertView。

③getItemCount() 這個方法就類似于BaseAdapter的getCount方法了,即總共有多少個條目。

高級控件使用講解的參考博客

這里寫圖片描述

參考博客,點擊查看

簡單的RecyclerView使用方法

1、添加依賴

compile 'com.android.support:recyclerview-v7:24.2.1'

2. 使用RecyclerView

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

3.創建適配器設置給RecyclerView

View view = inflater.inflate(R.layout.fragment_home, container, false); //獲取rv控件 RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv); rv.setLayoutManager(new LinearLayoutManager(getContext())); //設置Adapter MyAdapter adapter = new MyAdapter(); rv.setAdapter(adapter); return view;

4.創建適配器

PRivate class MyAdapter extends RecyclerView.Adapter<MyHolder>{ private final List<String> list; public MyAdapter(){ list = new ArrayList<String>(); for (int i = 0; i < 30; i++) { list.add("商品記錄" + i)}} //OnCreateViewHolder用來給rv創建緩存的 public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { //參數3:判斷條件 true 1.是打氣 2.添加到parent View view = LayoutInflater.from(getContext()).inflate(R.layout.main_recyclerview_item,parent,false); MyHolder holder = new MyHolder(view); return holder; } //給緩存控件設置數據 public void onBindViewHolder(MyHolder holder, int position) { String item = list.get(position); holder.textView.setText(item); holder.icon.setImageResource(R.drawable.ic_default); } //獲取記錄數 public int getItemCount() { return list.size(); }

5.創建HolderView

public class MyHolder extends RecyclerView.ViewHolder { public ImageView icon; public TextView textView; //實現的方法 public MyHolder(View itemView) { super(itemView); icon= (ImageView) itemView.findViewById(R.id.item_iv_icon); textView= (TextView) itemView.findViewById(R.id.item_tv_title); }}

封裝RecyclerView通用適配器

好處:1.數量動態 2.類型不限 Map<Integer,View> 作用:封裝了Adapter編寫的冗余代碼,提供簡潔的基類

思路:不寫死空間變量,而采用Map方式。 步驟:先關注比較火的控件庫 使用一下,看一下好處 學習下底層源代碼 自己動手體會 ①封裝了BaseHolder

//抽取BaseHolder繼承RecyclerView.ViewHolderpublic class BaseHolder extends RecyclerView.ViewHolder { //不寫死控件變量,而采用Map方式 private HashMap<Integer, View> mViews = new HashMap<>(); public BaseHolder(View itemView) { super(itemView); } /** *獲取控件的方法 */ public<T> T getView(Integer viewId){ //根據保存變量的類型 強轉為該類型 View view = mViews.get(viewId); if(view==null){ view= itemView.findViewById(viewId); //緩存 mViews.put(viewId,view); } return (T)view; } /** *傳入文本控件id和設置的文本值,設置文本 */ public BaseHolder setText(Integer viewId, String value){ TextView textView = getView(viewId); if (textView != null) { textView.setText(value); } return this; } /** * 傳入圖片控件id和資源id,設置圖片 */ public BaseHolder setImageResource(Integer viewId, Integer resId) { ImageView imageView = getView(viewId); if (imageView != null) { imageView.setImageResource(resId); } return this; } //...還可以擴展出各種控件。 //Fluent API 鏈式api obj.setxxx().setyyy()....}

②Holder封裝好之后,再封裝BaseAdapter

封裝的時候,部分參數可以選擇由外部的構造函數或者set方法 public class BaseAdapter<T> extends RecyclerView.Adapter<BaseHolder> { private List<T> mList = new ArrayList<>(); private int layoutId; public BaseAdapter(int layoutId,List<T> list){ this.layoutId=layoutId; this. mList=list; } //onCreateViewHolder用來給rv創建緩存 @Override public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) { //參數3 判斷條件 true 1.打氣 2.添加到paraent // false 1.打氣 (參考parent的寬度) View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); BaseHolder holder = new BaseHolder(view); return holder; } //onBindViewHolder給緩存控件設置數據 @Override public void onBindViewHolder(BaseHolder holder, int position) { T item = mList.get(position); convert(holder,item); } protected void convert(BaseHolder holder, T item) { //什么都沒有做 } //獲取記錄數據 @Override public int getItemCount() { return mList.size(); } }

③封裝之后,繼承實現

/** *1.extends 把父類的代碼繼承過來。 可以少寫很多代碼。 *2.因為是全部拿來的代碼,所以不是所有的代碼都適合當前。對于不適合當前的代碼(方法) * 我們可選擇@Override 覆蓋|重寫 */public class MyHomeAdapter extends BaseAdapter<String> { public MyHomeAdapter(List<String> list) { super(R.layout.main_recyclerview_item, list); } @Override protected void convert(BaseHolder holder, String item) { holder.setText(R.id.item_tv_title,item).setImageResource(R.id.image,R.drawable.ic_default); }}

④封裝之后,代碼實現

public class HomeFragment extends Fragment { private List<String> list; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_home, container, false); //獲取rv控件 RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv); b rv.setLayoutManager(new LinearLayoutManager(getContext())); initData(); //設置Adapter MyHomeAdapter adapter = new MyHomeAdapter(list); rv.setAdapter(adapter); return view;

案例1

依賴 布局文件activity_recycler_view.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v7.widget.RecyclerView android:id="@+id/id_recyclerview" android:divider="#FFB900" android:dividerHeight="1dp" android:layout_width="match_parent" android:layout_height="match_parent"/></RelativeLayout>

讓我們來看看變化最大的Adaper:

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{ private List<String> mList; private Context mContext;; public HomeAdapter(Context mContext,List<String>mList){ this.mContext=mContext; this.mList=mList; } public void removeData(int position) { mList.remove(position); notifyItemRemoved(position); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from( mContext).inflate(R.layout.item_recycler, parent, false)); return holder; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.tv.setText(mList.get(position)); } @Override public int getItemCount() { return mList.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; public MyViewHolder(View view) { super(view); tv = (TextView) view.findViewById(R.id.tv_item); } }}

最大的改進就是對ViewHolder進行了封裝定義,不用自己去自定義了,另外Adaper繼承RecyclerView.Adapter,在onCreateViewHolder加載條目布局,在onBindViewHolder中將視圖與數據進行綁定。 布局文件item_recycler.xml:

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="@android:color/white" android:layout_height="wrap_content" > <TextView android:id="@+id/tv_item" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="moon" /></FrameLayout>

這里寫圖片描述

高級進階—分割線


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品性视频| 91深夜福利视频| 国产午夜精品视频免费不卡69堂| 亚洲精品福利视频| 日韩精品久久久久| 久久久精品欧美| 日韩av免费在线播放| 98精品国产高清在线xxxx天堂| 95av在线视频| 午夜精品福利电影| 欧美性jizz18性欧美| 最新日韩中文字幕| 日韩一区在线视频| 日本国产欧美一区二区三区| 原创国产精品91| 亚洲偷熟乱区亚洲香蕉av| 尤物精品国产第一福利三区| 国产网站欧美日韩免费精品在线观看| 久久久久久久久久久免费精品| 国产精品美女免费看| 欧美综合在线观看| 欧美激情精品久久久久久久变态| 国产精品网红直播| 欧美午夜激情视频| 欧美日韩aaaa| 国产一区二区在线免费| 亚洲欧美日本精品| 亚洲国产日韩一区| 欧美性做爰毛片| 亚洲福利视频二区| 国产一区二区三区日韩欧美| 亚洲国产日韩一区| 97国产成人精品视频| 欧美丰满少妇xxxxx做受| 九色精品美女在线| 亚洲午夜激情免费视频| 国产成人精品一区二区| 色偷偷亚洲男人天堂| 亚洲精品视频中文字幕| 国产香蕉一区二区三区在线视频| 久久久久久久久久久久av| 精品国内产的精品视频在线观看| 成人国产精品免费视频| 91国在线精品国内播放| 久久人91精品久久久久久不卡| 欧美一级bbbbb性bbbb喷潮片| 亚洲乱亚洲乱妇无码| 亚洲视频欧洲视频| 激情亚洲一区二区三区四区| 亚洲最大成人网色| 狠狠综合久久av一区二区小说| 夜夜嗨av一区二区三区四区| 亚洲第一免费播放区| 国产精品尤物福利片在线观看| 精品国产999| 欧美大学生性色视频| 久久久久亚洲精品国产| 激情久久av一区av二区av三区| 欧美性受xxxx黑人猛交| 日本三级久久久| 成人精品一区二区三区电影免费| 国产色婷婷国产综合在线理论片a| 日韩激情视频在线| 中文字幕在线看视频国产欧美| 欧美中文在线视频| 欧美日韩国产黄| 精品亚洲一区二区三区四区五区| 欧美综合在线第二页| 亚洲成人免费网站| 91高潮精品免费porn| 精品国产一区二区三区久久狼黑人| 亚洲第一精品夜夜躁人人爽| 国产视频精品一区二区三区| 尤物99国产成人精品视频| 欧美性视频在线| 日韩中文在线中文网三级| 国产成人午夜视频网址| 国产一区二区在线免费| 国产精品视频一区国模私拍| 国外成人免费在线播放| 亚洲少妇中文在线| 久久国产精品久久久| 国产精品1234| 欧美精品电影免费在线观看| 伊人久久久久久久久久| 久久免费视频这里只有精品| 国产激情视频一区| 午夜精品免费视频| 久久欧美在线电影| 国产精品国产福利国产秒拍| 精品久久久视频| 一区二区欧美日韩视频| 欧美午夜久久久| 欧美噜噜久久久xxx| 亚洲国产成人精品一区二区| 国产精品偷伦视频免费观看国产| 一区二区三区视频在线| 狠狠色狠色综合曰曰| 成人在线国产精品| 亚洲免费电影在线观看| 色综合视频网站| 在线观看成人黄色| 亚洲一区二区三区久久| 欧美日韩福利在线观看| 孩xxxx性bbbb欧美| 国产欧亚日韩视频| 国产精品视频26uuu| 欧美小视频在线| 国产精品电影网| 77777少妇光屁股久久一区| 国产日韩精品在线播放| 另类视频在线观看| 4k岛国日韩精品**专区| 97在线看免费观看视频在线观看| 亚洲一区二区三区成人在线视频精品| 色哟哟入口国产精品| 成人xxxxx| 97色在线观看免费视频| 欧美激情区在线播放| 日本亚洲欧洲色| 91精品久久久久久久久久另类| 欧美色图在线视频| 国产精品视频1区| 国产a∨精品一区二区三区不卡| 性欧美视频videos6一9| 国产精品pans私拍| 中文字幕精品久久| 亚洲欧洲激情在线| 神马久久桃色视频| 亚洲无限乱码一二三四麻| 精品成人乱色一区二区| 国产成人综合精品| 国产日本欧美一区| 久久久亚洲国产| 日韩av电影院| 91高清在线免费观看| 久久精品99久久久香蕉| 欧美在线视频免费观看| 久久久精品免费视频| yw.139尤物在线精品视频| 92福利视频午夜1000合集在线观看| 亚洲欧美激情在线视频| 欧美在线视频导航| 日韩中文字幕网| 国产91精品久久久久久久| 日av在线播放中文不卡| 91在线免费视频| 亚洲夜晚福利在线观看| 国产精品旅馆在线| 久久久久久网站| 亚洲欧美综合另类中字| 国产suv精品一区二区| 国产精品久久久久久久久久三级| 456亚洲影院| 国产精品av免费在线观看| 亚洲日韩欧美视频一区| 色综合五月天导航| 亚洲女人天堂成人av在线| 亚洲精选中文字幕| 国产精品久久久久久久久久久久久| 国产丝袜一区二区三区免费视频| 欧美在线视频一二三| 国内精品400部情侣激情| 日韩最新在线视频|