首先,看一下效果圖

recyclerview.png
和ListView的區(qū)別
我們?yōu)槭裁匆胷ecyclerview,因?yàn)樗?strong>listview好用,它的功能更強(qiáng)大
那他們究竟有什么區(qū)別呢?
1.recyclerView 需要設(shè)置布局管理器,可以實(shí)現(xiàn)多種布局樣式的管理,而listview只能是列表樣式(只能在垂直方向上滾動(dòng))。
LinearLayoutManager ,可以支持水平和豎直方向上滾動(dòng)的列表。
GridLayoutManager ,支持網(wǎng)格展示,可以水平或者豎直滾動(dòng),如展示圖片的畫廊。
2.recyclerView沒有自己的點(diǎn)擊監(jiān)聽器,而Listview 有多種監(jiān)聽器。
3.在ListView中如果我們想要在item之間添加間隔符,我們只需要在布局文件中對(duì)ListView添加屬性(divider),RecyclerView在默認(rèn)情況下并不在item之間展示間隔符,你必須使用RecyclerView.ItemDecoration類來實(shí)現(xiàn)
如何使用
1.在build.gradle添加依賴
//依賴
implementation 'com.android.support:recyclerview-v7:29.0.0'
2.在Activity布局中加入recyclerview
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.在Activity找到recyclerview
private void initView() {
mRv = (RecyclerView) findViewById(R.id.rv);
//設(shè)置布局管理器
mRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
//設(shè)置數(shù)據(jù)
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("text" + i);
}
//綁定適配器
rvAdapter = new RvAdapter(list, this);
mRv.setAdapter(rvAdapter);
//來個(gè)分割線
mRv.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
//接口回調(diào)的操作
rvAdapter.setMyClickListener(this);
}
4.寫適配器之前,先寫條目的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical">
<TextView
android:id="@+id/rv_item_tv"
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
5.寫適配器RvAdapter
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> {
private List<String> myList;
private Context context;
//構(gòu)造方法 傳遞數(shù)據(jù)
public RvAdapter(ArrayList<String> list, Context context) {
myList = list;
this.context = context;
}
//接口回調(diào)
private MyClickListener myClickListener;
public void setMyClickListener(MyClickListener myClickListener) {
this.myClickListener=myClickListener;
}
@NonNull
@Override
//綁定布局
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_item, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@Override
//設(shè)置數(shù)據(jù)
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
TextView textView = holder.itemView.findViewById(R.id.rv_item_tv);
textView.setText(myList.get(position));
//對(duì)條目設(shè)置監(jiān)聽
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myClickListener.setOnClickListener(position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myClickListener.setOnLongClickListener(position);
return false;
}
});
}
@Override
//獲取條目數(shù)量
public int getItemCount() {
return myList.size();
}
//定義視圖管理器
class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(@NonNull View itemView) {
super(itemView);
}
}
//事件監(jiān)聽
public interface MyClickListener {
void setOnClickListener(int i);
void setOnLongClickListener(int i);
}
}
6.因?yàn)槔锩嬗斜O(jiān)聽,所以需要讓activity首先RvAdapter.MyClickListener接口,重寫方法
@Override
public void setOnClickListener(int i) {
Toast.makeText(this, "點(diǎn)擊" + i, Toast.LENGTH_SHORT).show();
}
@Override
public void setOnLongClickListener(int i) {
Toast.makeText(this, "長按" + i, Toast.LENGTH_SHORT).show();
}
最后記得不要忘記調(diào)用 接口的 set 方法,傳遞參數(shù)?。?!
//接口回調(diào)重要
rvAdapter.setMyClickListener(this);
穿插一個(gè)簡單面試題,簡述接口回調(diào)的使用思路?
- 在要傳遞數(shù)據(jù)的類中 定義接口
//事件監(jiān)聽
public interface MyClickListener {
void setOnClickListener(int i);
void setOnLongClickListener(int i);
}
- 以該接口為數(shù)據(jù)類型 定義成員變量
private MyClickListener myClickListener;
- 給該變量 定義 set 方法
public void setMyClickListener(MyClickListener myClickListener) {
this.myClickListener=myClickListener;
}
- 在要傳遞數(shù)據(jù)的監(jiān)聽中 使用接口對(duì)象調(diào)用接口方法
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myClickListener.setOnClickListener(position);
}
});
- 在要使用數(shù)據(jù)的類中調(diào)用 接口的 set(參數(shù)) 方法(參數(shù)可以是 1 this 2匿名實(shí)現(xiàn)類對(duì)象 3定義一個(gè)類實(shí)現(xiàn)接口 使用該類對(duì)象)
rvAdapter.setMyClickListener(this);
今天的文章就到這里了。