編輯:關於Android編程
android.support.v7.widget.RecyclerView
android.support.v7.widget.LinearLayoutManager
android.support.v7.widget.GridLayoutManager
android.support.v7.widget.StaggeeredGridLayoutManager
android.support.v7.widget.RecyclerView.Adapter
android.support.v7.widget.RecyclerView.ViewHolder
android.support.v7.widget.RecyclerView.LayoutManager
android.support.v7.widget.RecyclerView.ItemDecoration
android.support.v7.widget.RecyclerView.ItemAnimator
RecyclerView和以前的ListView、GridView相比起來,性能上更好,耦合性更低,然而使用起來相對來說復雜度有所增加,在開發中能夠使用這個控件的地方盡量使用。
下面介紹和RecyclerView緊密相關的幾個類型:
1、LayoutManager,這是控制RecyclerView布局方式的管理類,這是一個抽象類,默認提供的實現有LinearLayoutManager和GridLayoutManager和StaggeeredGridLayoutManager,主要對應於LinearLayoutManager:
2、ItemDecoration,主要用於RecyclerView的分割線,如果需要在RecyclerView中使用分割線就需要繼承這個類去自定義。RecyclerView沒有提供默認的分割線。 3、ItemAnimator,主要用於Item的添加、刪除時的動畫,需要使用的時候需要繼承自這個類去自定義。 4、Adapter,這是RecyclerView的一個內部類,作用和平時我們使用的Adapter一樣,主要用於RecyclerView的Adapter設置,在往RecyclerView中添加數據時需要繼承這個Adapter去實現自己的內容。 5、ViewHolder,類似於平時我們使用的Adapter中定義的ViewHolder,在使用RecyclerView的Adapter的時候必須使用該類。class MyAdapter extends RecyclerView.Adapter { private ArrayList mData = new ArrayList(); @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ MyViewHolder holder = new MyViewHolder(LayoutInflater.from( mContext).inflate(R.layout.recyclerview_item, parent, false)); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position){ holder.bindData(mData,position); } @Override public int getItemCount() { return mDatas.size(); } @Override public int getItemViewType(int position){ return super.getItemViewType(position); } static class MyViewHolder extends ViewHolder { TextView text; public MyViewHolder(View view) { super(view); text = (TextView) view.findViewById(android.R.id.text1); } public void bindData(ArrayList datas,int position){ text.setText(datas.get(position)); } } }
RecyclerView的初始化:
RecyclerView mList = (RecyclerView)mContentView.findViewById(R.id.recycler_view); mList.setLayoutManager(new LinearLayoutManager(mContext,LinearLayoutManager.VERTICAL,false)); mList.setAdapter(new MyAdapter());
Adapter常用方法,RecyclerView的Adapter和以前我們常用的Adapter區別還是挺大的,下面介紹一些常用方法
給Item創建一個ViewHolder,其中第一個參數parent是當前RecyclerView,第二個參數是Item的View的類型,可以重寫public int getItemViewType(int position)方法,public ViewHolder onCreateViewHolder(ViewGroup parent, int itemViewType)在這裡綁定Item和數據,其中第一個參數是在onCreateViewHolder返回的ViewHolder,第二個參數是當前Item的position。
public void onBindViewHolder(ViewHolder holder, int position)通過對不同的position返回不同的類型,然後在onCreateViewHolder中通過這裡的返回值去加載不同的View
public int getItemViewType(int position)和以前我們用的的notifyDataSetChanged()差不多。調用這個方法會更新所有可見的Item
public final void notifyDataSetChanged()更新指定位置的Item,這樣只會更新對應的Item,不會更新所有的Item,避免資源浪費。
public final void notifyItemChanged(int position)更新指定返回內的Item,第一個參數是更新的Item的起始位置,第二個參數是更新的Item的條數,例如,如果需要
public final void notifyItemRangeChanged(int positionStart, int itemCount)當新增一個Item的時候調用這個方法去更新新增的Item,不用全部更新。
public final void notifyItemInserted(int position)調用這個方法去更新從指定起始位置開始的多條Item,用在同時新增多條數據,不需要逐條更新的情況下。
public final void notifyItemRangeInserted(int positionStart, int itemCount)當刪除一條數據的時候調用這個方法去更新刪除的Item
public final void notifyItemRemoved(int position)當刪除多條數據,不需要逐條更新的時候調用這個方法去更新刪除掉的多個Item,從起始位置開始的多條。
public final void notifyItemRangeRemoved(int positionStart, int itemCount)
在使用RecyclerView時需要對Item設置ViewHolder,然後在ViewHolder中進行數據綁定和Item的初始化,這樣將數據處理和Adapter進行
static class MyViewHolder extends ViewHolder { TextView text; public MyViewHolder(View view) { super(view); text = (TextView) view.findViewById(android.R.id.text1); } public void bindData(ArrayList datas,int position){ text.setText(datas.get(position)); } }
ViewHolder常用方法:
構造函數,構造函數的參數就是Item的View,一般在這裡初始化Item中的View。public ViewHolder(View itemView)在Recyclerview 進行添加、移除item等操作時,position位置可能會變化,而所有的adapter的刷新並不總是及時的,只有這個方法返回的才是當前
public final int getLayoutPosition()獲得當前Item在Adapter中的位置
public final int getAdapterPosition()獲得當前Item的ViewType
public final int getItemViewType()設置當前Item是否可以被回收
public final void setIsRecyclable(boolean recyclable)查看當前Item是否可以被回收
public final boolean isRecyclable()
LayoutManager主要控制RecyclerView中Item的布局方式,默認提供了如下幾個LayoutManager
LinearLayoutManager使得RecyclerView的布局是線性的,要麼垂直布局,要麼水平布局。
LinearLayoutManager的常用屬性:
構造函數:
默認是垂直布局public LinearLayoutManager(Context context)第二個參數代碼布局方向,第三個參數代表是否逆向布局
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout)這個構造函數只在RecyclerView布局的時候指定mst:layoutManager時會被調用。
public LinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
常用方法:
當LayoutManager不起作用時是否會回收Itempublic boolean getRecycleChildrenOnDetach()設置當LayoutManager和RecyclerView脫離關系的時候是否會回收Item
public void setRecycleChildrenOnDetach(boolean recycleChildrenOnDetach)設置/獲取布局方向
public void setOrientation(int orientation) ; public int getOrientation();設置/獲取是否逆向布局
public void setReverseLayout(boolean reverseLayout) ; public boolean getReverseLayout()
常用方法先介紹這些,其他方法請參考Android官方文檔https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
GridLayoutManager是網格布局。
構造函數:
public GridLayoutManager(Context context, int spanCount);第二個構造函數參數相對較多,第二個參數是列數,第三個數布局方向,如果orientation為horizontal的話,spanCount表示行數,最後一個參數表示是否逆向布局
public GridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout)第三個構造函數主要用於從RecyclerView的布局中指定LayoutManager時使用
public GridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
常用方法:
設置每一個Item的跨度,通過這個方法可以設置Item的跨度,默認Item跨度為1,數值越大,跨度越大,例如默認情況:這種情況下spanCount為2,跨度為1
設置了自定義SpanSizeLookup:spanCount同樣為2,但是圖中的SpanSizeLookup是3, 2, 1, 3, 2, 1,3,2,1….這樣排列的,可以看到顯示效果的不同。
public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup)
其中第一個參數SpanSizeLookup是GridLayoutManager的一個內部抽象類,如果要使用的話需要去繼承這個類,並
實現public int getSpanSize(int position),在這裡返回SpanSizeLookup的數值。例如:
public static final class MySpanSizeLookup extends SpanSizeLookup { @Override public int getSpanSize(int position) { return 2; } }設置/獲取列數
public void setSpanCount(int spanCount) ; public int getSpanCount();最後是GridLayoutManager是繼承自LinearLayoutManager的,部分方法和LinearLayoutManager的一樣。
StaggeredGridLayoutManager可以實現瀑布流形式的布局,如下圖是一個列數為2的垂直方向上的瀑布流:
構造函數:
public StaggeredGridLayoutManager(int spanCount, int orientation);第二個構造函數,在從RecyclerView的布局中指定時使用。
public StaggeredGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
常用方法:
設置列數public void setSpanCount(int spanCount)設置布局方向,取值為StaggeredGridLayoutManager.VERTICAL和StaggeredGridLayoutManager.HORIZONTAL
public void setOrientation(int orientation)設置逆向布局
public void setReverseLayout(boolean reverseLayout)瀑布邊緣控制策略,在StaggeredGridLayoutManager的使用中,每一個布局的都會有一個布局邊緣,當滑動狀態變為SCROLL_STATE_IDLE的時候,StaggeredGridLayoutManager會
public void setGapStrategy(int gapStrategy);
取值為:StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
和StaggeredGridLayoutManager.GAP_HANDLING_NONE
public int[] findFirstVisibleItemPositions(int[] into)
AsyncTask的介紹及基本使用方法關於AsyncTask的介紹和基本使用方法可以參考官方文檔和《Android開發筆記之:深入理解多線程AsyncTask》這裡就不重
最近在項目中需要對外部存儲設備的狀態進行監聽,所以整理了此筆記,以便日後查看。 外部存儲設備的狀態變化時發出的廣播
第3節 TextView這是界面設計最為常用的控件,也是很多別的控件的父類,例如Button。3.1 文字常用屬性最常使用到的屬性,通過它們的名字就可以判斷出它們的作用:
又想到快要過年了,到時候還不知道群裡要發好多紅包,所以我將之前在網上宕的一份微信搶紅包的代碼修改了一下,實現了QQ搶紅包!可以支持搶QQ拼手氣紅包,普通紅包,口令紅包,現