RecyclerView
類似ListView及GridView,甚至能夠取代他們
RecyclerView 需要實作 RecyclerView.Adapter及Adapter的ViewHolder
// activity_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycleview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
拉好RecyclerView元件之後,還要建立item
// item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textColor="#111111"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
介面都完成後,就要開始打程式囉!
- 首先建立一個RecyclerViewAdapter.java
public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.MyViewHolder> {
public RecycleViewAdapter(Context context) {
this.context = context;
}
// 這部份主要寫綁定layout的程式
@Override
public RecycleViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
// 上面綁定layout後,在這裡實作物件功能
@Override
public void onBindViewHolder(final RecycleViewAdapter.MyViewHolder holder, final int position) {
}
// 執行的總次數
@Override
public int getItemCount() {
return 0;
}
// 自己寫ViewHolder來綁定控件
class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View view) {
super(view);
}
}
建立好之後就一個一個來修改囉
- 第一步 - 這個CreateViewHolder是當item被建立的時候會執行一次,這裡通常做綁定layout的功能
@Override public RecycleViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item,parent,false)); return holder; }
- 第二步 - 取得holder之後,需要自己寫一個class -> MyViewHolder來獲得layout上的元件
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public MyViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.textView2);
}
}
- 第三步 - 元件之後就可以在onBindViewHolder寫要對元件做的事情了
@Override public void onBindViewHolder(final RecycleViewAdapter.MyViewHolder holder, final int position) { // tv就是上面MyViewHolder宣告的TextView // holder就是最上面onCreateViewHolder取得到的holder holder.tv.setText("Count: "+position); }
- 第四步 - 最重要的三步都完成了,再來是更重要的最後一部
@Override public int getItemCount() { // 總共執行的次數,這會影響到產生的物件數量,如果這邊給0,那RecyclerView就不會顯示任何東西 return 20; }
完成了之後,我們需要把RecyclerViewAdapter指定給RecyclerView
- 回到MainActivity.java
// 進行RecyclerView物件綁定
RecyclerView mRecyclerView = (RecyclerView) view.findViewById(R.id.recycleview);
// 棋盤式
//RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,4);
// 瀑布式
//RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);
// 線性 ( 這裡用線性做範例 )
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager);
RecycleViewAdapter mAdapter = new RecycleViewAdapter(this);
mRecyclerView.setAdapter(mAdapter);