RecyclerView是一個非常好用的控制項,它的效果和ListView很相似,甚至可以說RecyclerView的出現是來取代ListView的 RecyclerView比ListView更加靈活,具有更高的擴展性 下麵就詳細的介紹RecyclerView的用法 既然RecyclerView上來取
RecyclerView是一個非常好用的控制項,它的效果和ListView很相似,甚至可以說RecyclerView的出現是來取代ListView的
RecyclerView比ListView更加靈活,具有更高的擴展性
下麵就詳細的介紹RecyclerView的用法
既然RecyclerView上來取帶ListView的那說明RecyclerView和ListView的用法很相似,事實確實這樣,也就是兩個東西,一個控制項和適配器(Adapter)
一:導包
我這裡開發使用的AndroidStudio,再使用RecyclerView之前要先引入RecyclerView的包(這個是必須的,也是不用解釋的)
在build文件中找到dependencies代碼塊,添加compile 'com.android.support:recyclerview-v7:23.0.0'這句話,重新構建項目就可以使用RecyclerView了
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:recyclerview-v7:23.0.0' }
二:寫xml文件
做完上面的工作就可以開始寫代碼了,首先創建一個Activity同時生成xml佈局文件,在佈局文件中寫入RecyclerView控制項
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
再寫上面的代碼是RecyclerView的時候不能直接寫RecyclerView,必須加上前面的android.support.v7.widget,如果記不起前面的內容,給你說一種簡便方法,現在Activity中聲明一個變數RecyclerView
可以看到聲明瞭RecyclerView之後上面的import就會自動生成,import後面的內容就是RecyclerView的全路徑了。
三:寫適配器類
首先創建一個類繼承自RecyclerView.Adapter
相信在ListView中已經很熟悉ViewHolder這個類了,在RecyclerView的Adapter中ViewHolder內置了,所以先不要管什麼,必須先寫一個ViewHolder內部類繼承自RecyclerView.ViewHolder,重寫構造函數,這個時候先不要急實現Adapter的抽象方法
public class MyRecyclerViewAdapter extends RecyclerView.Adapter { class MyViewHolder extends RecyclerView.ViewHolder{ public MyViewHolder(View itemView) { super(itemView); } } }
做完上面的再去將我們寫的ViewHolder給Adapter綁上,就是RecyclerView.Adapter後面尖括弧的內容
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> { class MyViewHolder extends RecyclerView.ViewHolder{ public MyViewHolder(View itemView) { super(itemView); } } }
昨晚上面的步驟再去實現Adapter的抽象方法
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { return null; } @Override public void onBindViewHolder(MyViewHolder myViewHolder, int i) { } @Override public int getItemCount() { return 0; } class MyViewHolder extends RecyclerView.ViewHolder{ public MyViewHolder(View itemView) { super(itemView); } } }
如果先去實現了上面的抽象方法,不先做上面的步驟你會很麻煩,甚至可能會思維混亂不知所措
這樣這個Adapter類基本成型了,下麵來介紹這些方法的作用
首先onCreateViewHolder()這個方法看名字就知道是用來創建ViewHolder類的,上面雖然寫出了ViewHolder類但是還沒有生成實例,也就是new的過程所以這個方法就是用來new ViewHolder的,看myViewHolder有一個構造方法,構造方法裡面有一個View的對象,所以在這裡創建ViewHolder的時候要傳入一個參數,這裡的這個View很簡單就是你RecyclerView的每一項的View的對象,用LayoutInflater載入,最後返回ViewHolder
其次onBinderViewHolder();這裡面有兩個參數MyViewHolder myViewHolder 你生成的ViewHolder實例, int i 代表目前是哪一行,所以這個方法是來給ViewHolder裡面的控制項賦值的
再看getItemCount();就是確定你這個RecyclerView有多少行
MyViewHolder是初始化每一行空間的地方
將上面的方法都實現就形成了下麵的Adapter類
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> mList; private Context context; public MyAdapter(List<String> mList,Context context){ this.mList = mList; this.context = context; } @Override public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false); MyViewHolder viewHolder = new MyViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(MyViewHolder myViewHolder, int i) { myViewHolder.tv_msg.setText(mList.get(i)); } @Override public int getItemCount() { return mList.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ TextView tv_msg; public MyViewHolder(View itemView) { super(itemView); tv_msg = (TextView) itemView.findViewById(R.id.tv_msg); } } }
四:最後Activity裡面的內容
在Activity裡面的內容就很簡單了,也就是setAdapter了,值得提提的是除了設置Adapter,在RecyclerView裡面有一個LayoutManager的東西,這也是RecyclerView擴展性高的主要原因
代碼如下
public class MainActivity extends Activity { private RecyclerView recyclerView; private List<String> mList ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); function(); } private void function() { mList = new ArrayList<>(); for (int i = 0 ; i < 20 ; i++){ mList.add("Hello"+i); } MyAdapter adapter = new MyAdapter(mList,this); LinearLayoutManager llm = new LinearLayoutManager(this,0,false); recyclerView.setLayoutManager(llm); recyclerView.setAdapter(adapter); } private void initView() { recyclerView = (RecyclerView) findViewById(R.id.recyclerView); } }
解釋一下,首先通過findViewById找到RecyclerView
然後初始化List
然後生成Adapter實例
接下來生成LayoutManager的對象
最後設置LayoutManager和Adapter。
五:最後
解釋一下LayoutManager
RecyclerView的LayoutManager有三種,常用的有兩種,這裡接介紹下常用的兩種
第一種LinearLayoutManager
這個一看就知道線性佈局管理,構造方法有三個參數,第一個上下文對象(不描述),第二個是一個int型的參數(只能是0和1)0代表橫向,1代表縱向,第三個參數Boolean表示順序還是倒序
false代表順序,true代表倒序;這種佈局管理器的效果和ListView的效果是一樣的一行只能放一個item
第二種GridLayoutManager
這個一看就知道是網格佈局管理器,也就是說用這種管理器可在一行放多個item,它有兩個參數;第一個上下文對象化,第二個int型表示一行放的item的個數(1:表示一行放一個item;2:表示一行放2個item)