-
getItemOffsets()查看全部
-
reclycler中各個item設(shè)置邊界查看全部
-
recyclerview holder是保存view的單位,記錄在recyclerview的基本信息查看全部
-
RecyclerView實(shí)現(xiàn)多數(shù)據(jù)類型的list和grid混編 4.三個ViewHolder的改造 ViewHolder的bindViewHolder()會講viewHolder的控件成員和對應(yīng)位置的數(shù)據(jù)綁定,但是現(xiàn)在有三種不同的數(shù)據(jù)類型,如何解決? (1)三種數(shù)據(jù)ViewHolder繼承RecyclerView.ViewHolder,各自實(shí)現(xiàn) 在onBindViewHolder()中根據(jù)不同viewType綁定不同的數(shù)據(jù) (2)還是抽象一個ViewHolder,用T范型 public abstract class AbstractViewHolder<T> extends RecyclerView.ViewHolder{ public AbstractViewHolder(View itemView) { super(itemView); } public abstract void bindViewHolder(T dataModel); } 5.Adapter的改造 (1)getItemCount()和getItemViewType() 由于mTypes根據(jù)位置存放了所有數(shù)據(jù)的類型,所以可以直接從mTypes獲取 public int getItemViewType(int position) { return mTypes.get(position); } (2)onCreateViewHolder() onBindViewHolder() 如圖,需要說明: int realPosition = position - mFirstPositions.get(viewType); 是從每個list中取出item在它對應(yīng)的數(shù)據(jù)列表的真實(shí)位置,這樣可以拿出item的數(shù)據(jù)mList1.get(realPosition) 然后拿這個數(shù)據(jù)來和viewHolder的控件綁定 holder.bindViewHolder(mList1.get(realPosition));查看全部
-
RecyclerView實(shí)現(xiàn)多數(shù)據(jù)類型的list和grid混編 1.原理 如果每個item是不同的布局,就會有多種數(shù)據(jù)類型,這樣就需要定義多個不同的數(shù)據(jù)類型 比如 public class ItemDataModelTwo { int avatarColor; String name; String content; } 這三種數(shù)據(jù)類型有不同的布局,而且只有第三種類型的數(shù)據(jù)才會list編排,前面兩種類類型的數(shù)據(jù)都是grid編排。這樣就有三個不同的數(shù)據(jù)列表list 這樣就需要為每個item數(shù)據(jù)標(biāo)上它的類型,這樣從對應(yīng)的位置就能獲得它的viewType,然后就可以在onCreateViewHolder()和onBindViewHolder()中根據(jù)不同viewType做不同操作。 2.初始化所有的數(shù)據(jù) 如圖 3.把數(shù)據(jù)傳遞給adapter public void addList(List<ModelOne> list1, List<ModelTwo> list2, List<ModelThree> list3) { this.mList1 = list1; this.mList2 = list2; this.mList3 = list3; // 為三種類型的數(shù)據(jù)列表分別置頂type類型,并初始化每個列表的初始位置 addListByType(TYPE_ONE, list1); addListByType(TYPE_TWO, list2); addListByType(TYPE_THREE, list3); } private void addListByType(int type, List list) { mPositions.put(type, mTypes.size()); for (int i = 0; i < list.size(); i++) { mTypes.add(type); } } 說明:mTypes按照位置存放每個item的類型,所以它的size是全部數(shù)據(jù)的size mPositions存放三種數(shù)據(jù)列表的起始位置查看全部
-
Grid和List混排的recyclerView 1.原理 grid形式的RecyclerView一般都是一行有多列,但是list形式的可以看作是只有一列的grid形式。 2.實(shí)現(xiàn) (1)為RecyclerView設(shè)置GridLayoutManager,可以指定列數(shù) GridLayoutManager layoutManager = new GridLayoutManager(this, 2); mRecyclerView.setLayoutManager(layoutManager); (2)grid和list混合編排 grid形式下,如果將某一itemView設(shè)置為獨(dú)占一行就可以了,這可以通過判斷itemType來設(shè)置。比如本來是兩列,讓某一itemView占兩列就是list形式 layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { int itemType = mRecyclerView.getAdapter().getItemViewType(position); if (ItemDataModel.TYPE_THREE == itemType) { return layoutManager.getSpanCount(); // 返回是總列數(shù),獨(dú)占全部列數(shù) } else { return 1; } } }); 3.為每個itemView設(shè)置背景和間距 如圖,說明: getItemOffsets()的view參數(shù)是itemView,通過它來獲得每一行的LayoutParams layoutParams.getSpanSize() 獲取itemView所占的列數(shù) layoutParams.getSpanIndex() 獲取當(dāng)前itemView在第幾列 視頻中代碼為grid形式一行兩列的每個itemView設(shè)置了上下,左右20的間距查看全部
-
多種樣式的列表實(shí)現(xiàn)(下) 1.前面說要新建一個抽象ViewHolder,然后派生三個ViewHolder,如 public class TypeOneViewHolder extends AbstractViewHolder { public ImageView avatar; public TextView name; public TypeOneViewHolder(View itemView) { super(itemView); avatar = (ImageView) itemView.findViewById(R.id.avatar); name = (TextView) itemView.findViewById(R.id.name); } @Override public void bindViewHolder(ItemDataModel item) { avatar.setImageResource(item.getAvatarColor()); name.setText(item.getName()); } } 2.關(guān)鍵的adapter (1)和視頻中不同,這里Adapter的范型是AbstractViewHolder public class DemoAdapter extends RecyclerView.Adapter<AbstractViewHolder>{ (2)onCreateViewHolder() 返回ViewHolder,ViewHolder是根據(jù)每個布局inflate出來的view來創(chuàng)建的 new TypeOneViewHolder(mInflater.inflate(R.layout.item_type_one, parent, false)); 然后根據(jù)不同布局類型viewType返回不同的ViewHolder,如圖 (3)onBindViewHolder() ViewHolder的控件成員和對應(yīng)的item數(shù)據(jù)綁定的過程,如圖 3.最最關(guān)鍵的getItemViewType() 返回不同布局的viewType,onCreateViewHolder()會根據(jù)它來創(chuàng)建不同的viewHolder查看全部
-
多種樣式的列表實(shí)現(xiàn) 1.MainActivity的實(shí)現(xiàn),主要看偽造數(shù)據(jù)的部分 如圖,需要注意隨機(jī)數(shù)生成: int type = ((int) (Math.random() * 3) + 1); Math.random()是0~1,(Math.random() * 3)就是0~3,強(qiáng)轉(zhuǎn)int就是0,1,2,所以((int) (Math.random() * 3) + 1)就是1,2,3,最后(type + 1) % 3就是2,0,1 2.根據(jù)三個不同顯示情況設(shè)計ItemDataModel,這個類的成員是每個itemView中要顯示數(shù)據(jù)的數(shù)據(jù)源 public class ItemDataModel { public static final int TYPE_ONE = 1; public static final int TYPE_TWO = 2; public static final int TYPE_THREE = 3; public int type; public int avatarColor; public String name; public String content; public int contentColor; 3.三種不同布局的ViewHolder ViewHolder包含了每個itemView中所有的控件,因為這里是三個不同的布局,且相差不大,所以定義一個抽象ViewHolder,再來派生三個ViewHolder。 RecyclerView的Adapter中有兩個重要重寫方法onCreateViewHolder(),onBindViewHolder() 前者需要返回創(chuàng)建的ViewHolder,后者需要為ViewHolder的控件成員設(shè)置要顯示的數(shù)據(jù)。 public abstract class AbstractViewHolder extends RecyclerView.ViewHolder{ public AbstractViewHolder(View itemView) { super(itemView); } public abstract void bindViewHolder(ItemDataModel item); }查看全部
-
基礎(chǔ)知識 1.RecyclerView.Recycler 如圖,多個RecyclerView共用一個緩存池,RecycleredPool??梢耘渲镁彺娉氐膕ize查看全部
-
簡介 1.RecyclerView的關(guān)鍵成員 (1)getItemViewType(int position) 根據(jù)不同位置返回不同的類型 (2)RecyclerView.ViewHolder 類似于listview的viewholder,每個item view中所以控件成員。RecyclerView中不再需要創(chuàng)建,只需要繼承。 (3)RecyclerView.Recycler 緩存機(jī)制,可以看一下listview的covertView,不需要再處理緩存。 2.數(shù)據(jù)處理 如圖 3.RecyclerView顯示流程 比如滑動列表時,滾動->調(diào)用getItemViewType(position)根據(jù)position獲取holder->如果為空,調(diào)用onCreateViewHolder(),否則調(diào)用onBindViewHolder() itemType是保存在viewHolder(繼承RecyclerView.ViewHolder)中的,viewHolder是對應(yīng)于position的,緩存在cache中。 public void onBindViewHolder(final MyViewHolder holder, int position) 當(dāng)顯示需要復(fù)用時,從cache中取holder來顯示。所以看起來比較流暢。 4.RecyclerView.ViewHolder 這里面包含了所有的view,除此之外,還有position,itemType,是否被緩存的flag等基本信息 public static abstract class ViewHolder { public final View itemView; int mPosition = NO_POSITION; int mOldPosition = NO_POSITION; long mItemId = NO_ID; int mItemViewType = INVALID_TYPE; int mPreLayoutPosition = NO_POSITION;查看全部
-
數(shù)據(jù)結(jié)構(gòu)查看全部
-
多種布局設(shè)計流程查看全部
-
綁定View查看全部
-
分別從list種拿數(shù)據(jù)查看全部
-
怎么取不同集合數(shù)據(jù)查看全部
舉報
0/150
提交
取消