什么是Adapter?
Adapter 對象充當AdapterView
視圖和底層數據之間的橋梁。適配器提供對數據項的訪問。Adapter 還負責為android.view.View
數據集中的每個項目制作一個。
簡單來說,Adapter提供了一個將其他View嵌套進RecycleView
的方法,使每個RecycleView
的item
遵循自定義的視圖。
Adapter的使用
定義 Adapter 時,您需要替換三個關鍵方法:
-
onCreateViewHolder()
:每當 RecyclerView 需要創建新的 ViewHolder 時,它都會調用此方法。此方法會創建並初始化 ViewHolder 及其關聯的 View,但不會填充視圖的內容,因為 ViewHolder 此時尚未綁定到具體數據。 -
onBindViewHolder()
:RecyclerView 調用此方法將 ViewHolder 與數據相關聯。此方法會提取適當的數據,並使用該數據填充 ViewHolder 的布局。例如,如果 RecyclerView 顯示的是一個名稱列表,該方法可能會在列表中查找適當的名稱,並填充 ViewHolder 的 TextView widget。 -
getItemCount()
:RecyclerView 調用此方法來獲取數據集的大小。例如,在通訊簿應用中,這可能是地址總數。RecyclerView 使用此方法來確定什么時候沒有更多的列表項可以顯示。
下面是一個典型的簡單 Adapter
示例,該 Adapter
主要接受初始化時傳來的List<user>
數據,同時接受一個自定義點擊事件接口。為了使RecycleView
顯示List
的內容,需要將List
大小及內容傳入Adapter
來顯示。
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
//定義所需傳入的參數
private List<User> users;
private Context context;
private OnItemClickListener listener;
//初始化Adapter時傳入相關參數
public CustomAdapter(List<User> users,Context context,OnItemClickListener listener) {
this.users = users;
this.context = context;
this.listener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//使每一個RecycleView中的視圖都顯示為R.layout.item的樣式
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//顯示當前時間
Date date = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//設置顯示的文本
holder.textView.setText(users.get(position).content);
holder.tv_1.setText(ft.format(date));
//設置每個item長按事件
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
listener.onLongClick(position,users.get(position));
return false;
}
});
//設置點擊事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onClick(position,users.get(position));
}
});
}
@Override
public int getItemCount() {
//返回List的大小,使其全部顯示
return users.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView textView,tv_1;
public ViewHolder(@NonNull View itemView) {
super(itemView);
//定位要設置的控件
textView = itemView.findViewById(R.id.tv_content);
tv_1 = itemView.findViewById(R.id.tv_date);
}
}
public interface OnItemClickListener{
//在初始化時獲得事件
void onClick(int pos,User user);
void onLongClick(int pos,User user);
}
}
總項目地址請看:記事本app