-
getItemOffsets()查看全部
-
reclycler中各個item設置邊界查看全部
-
recyclerview holder是保存view的單位,記錄在recyclerview的基本信息查看全部
-
RecyclerView實現多數據類型的list和grid混編 4.三個ViewHolder的改造 ViewHolder的bindViewHolder()會講viewHolder的控件成員和對應位置的數據綁定,但是現在有三種不同的數據類型,如何解決? (1)三種數據ViewHolder繼承RecyclerView.ViewHolder,各自實現 在onBindViewHolder()中根據不同viewType綁定不同的數據 (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根據位置存放了所有數據的類型,所以可以直接從mTypes獲取 public int getItemViewType(int position) { return mTypes.get(position); } (2)onCreateViewHolder() onBindViewHolder() 如圖,需要說明: int realPosition = position - mFirstPositions.get(viewType); 是從每個list中取出item在它對應的數據列表的真實位置,這樣可以拿出item的數據mList1.get(realPosition) 然后拿這個數據來和viewHolder的控件綁定 holder.bindViewHolder(mList1.get(realPosition));查看全部
-
RecyclerView實現多數據類型的list和grid混編 1.原理 如果每個item是不同的布局,就會有多種數據類型,這樣就需要定義多個不同的數據類型 比如 public class ItemDataModelTwo { int avatarColor; String name; String content; } 這三種數據類型有不同的布局,而且只有第三種類型的數據才會list編排,前面兩種類類型的數據都是grid編排。這樣就有三個不同的數據列表list 這樣就需要為每個item數據標上它的類型,這樣從對應的位置就能獲得它的viewType,然后就可以在onCreateViewHolder()和onBindViewHolder()中根據不同viewType做不同操作。 2.初始化所有的數據 如圖 3.把數據傳遞給adapter public void addList(List<ModelOne> list1, List<ModelTwo> list2, List<ModelThree> list3) { this.mList1 = list1; this.mList2 = list2; this.mList3 = list3; // 為三種類型的數據列表分別置頂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是全部數據的size mPositions存放三種數據列表的起始位置查看全部
-
Grid和List混排的recyclerView 1.原理 grid形式的RecyclerView一般都是一行有多列,但是list形式的可以看作是只有一列的grid形式。 2.實現 (1)為RecyclerView設置GridLayoutManager,可以指定列數 GridLayoutManager layoutManager = new GridLayoutManager(this, 2); mRecyclerView.setLayoutManager(layoutManager); (2)grid和list混合編排 grid形式下,如果將某一itemView設置為獨占一行就可以了,這可以通過判斷itemType來設置。比如本來是兩列,讓某一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(); // 返回是總列數,獨占全部列數 } else { return 1; } } }); 3.為每個itemView設置背景和間距 如圖,說明: getItemOffsets()的view參數是itemView,通過它來獲得每一行的LayoutParams layoutParams.getSpanSize() 獲取itemView所占的列數 layoutParams.getSpanIndex() 獲取當前itemView在第幾列 視頻中代碼為grid形式一行兩列的每個itemView設置了上下,左右20的間距查看全部
-
多種樣式的列表實現(下) 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.關鍵的adapter (1)和視頻中不同,這里Adapter的范型是AbstractViewHolder public class DemoAdapter extends RecyclerView.Adapter<AbstractViewHolder>{ (2)onCreateViewHolder() 返回ViewHolder,ViewHolder是根據每個布局inflate出來的view來創建的 new TypeOneViewHolder(mInflater.inflate(R.layout.item_type_one, parent, false)); 然后根據不同布局類型viewType返回不同的ViewHolder,如圖 (3)onBindViewHolder() ViewHolder的控件成員和對應的item數據綁定的過程,如圖 3.最最關鍵的getItemViewType() 返回不同布局的viewType,onCreateViewHolder()會根據它來創建不同的viewHolder查看全部
-
多種樣式的列表實現 1.MainActivity的實現,主要看偽造數據的部分 如圖,需要注意隨機數生成: int type = ((int) (Math.random() * 3) + 1); Math.random()是0~1,(Math.random() * 3)就是0~3,強轉int就是0,1,2,所以((int) (Math.random() * 3) + 1)就是1,2,3,最后(type + 1) % 3就是2,0,1 2.根據三個不同顯示情況設計ItemDataModel,這個類的成員是每個itemView中要顯示數據的數據源 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() 前者需要返回創建的ViewHolder,后者需要為ViewHolder的控件成員設置要顯示的數據。 public abstract class AbstractViewHolder extends RecyclerView.ViewHolder{ public AbstractViewHolder(View itemView) { super(itemView); } public abstract void bindViewHolder(ItemDataModel item); }查看全部
-
基礎知識 1.RecyclerView.Recycler 如圖,多個RecyclerView共用一個緩存池,RecycleredPool??梢耘渲镁彺娉氐膕ize查看全部
-
簡介 1.RecyclerView的關鍵成員 (1)getItemViewType(int position) 根據不同位置返回不同的類型 (2)RecyclerView.ViewHolder 類似于listview的viewholder,每個item view中所以控件成員。RecyclerView中不再需要創建,只需要繼承。 (3)RecyclerView.Recycler 緩存機制,可以看一下listview的covertView,不需要再處理緩存。 2.數據處理 如圖 3.RecyclerView顯示流程 比如滑動列表時,滾動->調用getItemViewType(position)根據position獲取holder->如果為空,調用onCreateViewHolder(),否則調用onBindViewHolder() itemType是保存在viewHolder(繼承RecyclerView.ViewHolder)中的,viewHolder是對應于position的,緩存在cache中。 public void onBindViewHolder(final MyViewHolder holder, int position) 當顯示需要復用時,從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;查看全部
-
數據結構查看全部
-
多種布局設計流程查看全部
-
綁定View查看全部
-
分別從list種拿數據查看全部
-
怎么取不同集合數據查看全部
舉報
0/150
提交
取消