由於Recyclerview是在 android.support.v7.widget.包 RecyclerView,所以需要導Recycler庫:
導Recycler庫:
選擇項目,右鍵-->
點擊+圖標:
選擇 Library dependency:
輸入 com.android.support:recyclerview ,進行搜索,看有什么RecyclerView版本可以用
敲回車搜索之后的結果是:com.android.support:recyclerview-v7 ............
點擊OK即可:
就導入成功了,然后在點擊即可:
RecyclerView默認是沒有分割線的:
給RecyclerView增加 第一種(默認)分割線:
/** * DividerItemDecoration是android.support.v7.widget包中的 * new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); 這樣寫有一個默認的分割線 */ DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); recyclerView.addItemDecoration(dividerItemDecoration);
DividerItemDecoration 默認分割線的效果:
給RecyclerView增加 第二種 自定義分割線
添加自定義的分割線,需要在drawable文件夾下/添加divider_bg.xml:
divider_bg.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <gradient android:centerColor="#ff00ff00" android:endColor="#ff0000ff" android:startColor="#ffff0000" android:type="linear" /> <size android:height="2dp"/> </shape>
在Activity>>recyclerView中設置引入divider_bg.xml
/** * DividerItemDecoration是android.support.v7.widget包中的 * new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); 這樣寫有一個默認的分割線 第一種分割線 */ DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); /** * 第二種分割線 自定義 divider_bg */ dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.divider_bg)); recyclerView.addItemDecoration(dividerItemDecoration);
顯示效果:
完整代碼:
1.Activity:
package com.example.myapplication.recycler3; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.example.myapplication.R; import java.util.ArrayList; import java.util.List; public class MyRecyclerActiviy extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler); // 引入布局的RecyclerView,初始化RecyclerView 可以理解為ListView RecyclerView recyclerView = findViewById(R.id.recycler_view); /** * 實例化適配器 * RecyclerView需要的適配器是RecyclerView.Adapter adapter */ MyRecyclerAdapter myRecyclerAdapter = new MyRecyclerAdapter(this, getPersons()); /** * 設置適配器,可以理解為ListView設置適配器 * 不同的是 RecyclerView需要的適配器是RecyclerView.Adapter adapter */ recyclerView.setAdapter(myRecyclerAdapter); /** * 注意:以上步驟 還不能顯示數據,還是一片顯示空白 空白,為何空白 因為都沒有去執行MyRecyclerAdpater的代碼 * 需要設置以下代碼setLayoutManager,才能顯示 */ LinearLayoutManager manager = new LinearLayoutManager(MyRecyclerActiviy.this, // 參數一:上下文環境 LinearLayoutManager.VERTICAL, // 參數二:顯示方向 垂直 false); // 參數三:是否倒序 recyclerView.setLayoutManager(manager); /** * DividerItemDecoration是android.support.v7.widget包中的 * new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); 這樣寫有一個默認的分割線 第一種分割線 */ DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); /** * 第二種分割線 自定義 divider_bg */ dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.divider_bg)); recyclerView.addItemDecoration(dividerItemDecoration); } /** * 此方法模擬數據 * @return */ private List<Person> getPersons() { List<Person> persons = new ArrayList<>(); for (int i = 0; i < 100; i++) { persons.add(new Person("李元霸" + i, "先鋒" + i, 18 + i)); } return persons; } }
2.Activity的布局文件:
<?xml version="1.0" encoding="utf-8"?> <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/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
3.自定義分割線的 drawable/divider_bg.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <gradient android:centerColor="#ff00ff00" android:endColor="#ff0000ff" android:startColor="#ffff0000" android:type="linear" /> <size android:height="2dp"/> </shape>
4.RecyclerView需要的適配器,MyRecyclerAdapter:
package com.example.myapplication.recycler3; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.myapplication.R; import java.util.List; /** * RecyclerView需要的適配器 >>> RecyclerView.Adapter<VH> * VH就是:RecyclerView.ViewHolder * VH全程:View-Holder */ public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> { private LayoutInflater layoutInflater; // 布局加載器 用於加載 Item Layout private List<Person> persons; // 需要顯示的數據 /** * 定義此構造方法 是為了接收數據 和 Context */ public MyRecyclerAdapter(Context context, List<Person> persons) { layoutInflater = LayoutInflater.from(context); this.persons = persons; } /** * 此方法相當於 ListView-MyBaseAdapte中的getView()方法的 創建View 、 創建ViewHolder * @param viewGroup * @param i * @return */ @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View itemView = layoutInflater.inflate(R.layout.recycler_item_layout, null); return new MyViewHolder(itemView); } /** * 此方法作用是:ItemLayout里面的View 和數據 進行綁定操作 * 可以理解為:以前ListView-MyBaseAdapter-getView()方法里面的--ItemLayout里面的View 和數據 進行綁定操作 * @param myViewHolder * @param index */ @Override public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int index) { /** * 第一步:得到數據,數據集合.get(i、position、index ...); */ Person person = persons.get(index); /** * 第二步:把數據設置到>>>> MyViewHolder 的 Item Layout 控件中去 */ myViewHolder.tvName.setText(person.getName()); myViewHolder.tvWork.setText(person.getWork()); myViewHolder.tvAge.setText(person.getAge() + ""); } /** * 此方法是返回Item的總數 * 可以理解為ListView-MyBaseAdapter 中的 public int getCount() {} 方法 * @return */ @Override public int getItemCount() { return persons.size(); // 返回數據的總大小 } /** * 描述MyViewHolder,可以想象ListView-MyBaseAdapter中也有ViewHolder、 * 此MyViewHolder,是RecyclerView.ViewHolder的子類 */ class MyViewHolder extends RecyclerView.ViewHolder { private TextView tvName; private TextView tvWork; private TextView tvAge; /** * 此構造方法接收一個View,此View是 onCreateViewHolder方法中傳遞過來的View->Item * @param itemView */ public MyViewHolder(@NonNull View itemView) { super(itemView); tvName = itemView.findViewById(R.id.tv_name); tvWork = itemView.findViewById(R.id.tv_work); tvAge = itemView.findViewById(R.id.tv_age); } } }
5.MyRecyclerViewAdapter適配器的 Item Layout 文件
<?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:padding="10dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="姓名" android:layout_marginLeft="20dp" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:textColor="@android:color/black" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="職位" android:layout_marginLeft="20dp" /> <TextView android:id="@+id/tv_work" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:textColor="@android:color/black" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="年齡" /> <TextView android:id="@+id/tv_age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:textColor="@android:color/black" /> </LinearLayout> </LinearLayout>
6.數據 Bean Person:
package com.example.myapplication.recycler3; public class Person { private String name; private String work; private int age; public Person(String name, String work, int age) { this.name = name; this.work = work; this.age = age; } public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getWork() { return work; } public void setWork(String work) { this.work = work; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", work='" + work + '\'' + ", age=" + age + '}'; } }