使用RecyclerView 加載大量數據集已經有一端時間了,但是一直沒有對RecyclerView 總結過。今天再一次使用到RecyclerView ,就在這裏做一次詳細的總結。
引入庫
使用RecyclerView 首先需要引入類。在build.gradle文件中引入該類。
implementation 'com.android.support:recyclerview-v7:26.1.0'
LayoutManager:佈局管理器
RecyclerView和ListView、GridView不同的一點就是需要添加布局管理器。RecyclerView的佈局管理器是一個抽象類,系統提供了三個實現類:
- LinearLayoutManager 線性佈局管理器,支持橫向或縱向選擇。
- GridLayoutManager 網格佈局管理器 使用該佈局可以實現類似GridView的效果
- StaggeredGridLayoutManager 瀑布流 佈局管理器 (如果想用 RecyclerView 來實現自定義效果,則應該去繼承實現 LayoutManager,並重寫相應的方法。)
RecyclerView的基本使用
recyclerview 用法其實也很簡單 activity源碼如下:
public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private List<String> datas; private CharRecyclerAdapter recyclerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); initData(); initRecyclerView(); } private void initRecyclerView() { // 定義一個線性佈局管理器 LinearLayoutManager manager = new LinearLayoutManager(this); recyclerView.setLayoutManager(manager); //設置adapter recyclerAdapter=new CharRecyclerAdapter(this,datas); recyclerView.setAdapter(recyclerAdapter); } private void initData() { datas=new ArrayList<>(); for (int i='A';i<='Z';i++){ datas.add((char)i+""); } } private void initUI() { recyclerView=findViewById(R.id.recyclerView); } }
adapter源碼如下:
public class CharRecyclerAdapter extends RecyclerView.Adapter<CharRecyclerAdapter.ViewHolder> { private List<String> datas; private Context context; public CharRecyclerAdapter(Context context, List<String> datas) { this.context=context; this.datas=datas; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { String charStr=datas.get(position); holder.tv.setText(charStr); } @Override public int getItemCount() { return datas.size(); } static class ViewHolder extends RecyclerView.ViewHolder{ private TextView tv; public ViewHolder(View itemView) { super(itemView); tv=itemView.findViewById(R.id.tv); } } }
activity_main佈局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </LinearLayout>
item佈局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="#f0f" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:src="@mipmap/ic_launcher" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:text="1" android:gravity="center" android:id="@+id/tv" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="match_parent" /> </LinearLayout>
實現類似listview效果圖如下: