RecyclerView爲了給開發者提供更大的自由度,沒有默認的提供onItemClick接口。
網上有一種比較簡單的實現方式 , 適用於不需要針對item裏面某個按鈕做特殊處理的情況
我目前項目的需求是,
1.單擊item,跳轉到用戶信息頁。
2.單擊加關注按鈕,更改按鈕狀態。
adapter代碼如下
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.BaseViewHolder> {
private List<User> mList; //用戶列表
private Context mContext;
public PraisedAdapter(Context context,List<User> list){
mContext = context;
this.mList = list;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).
inflate(R.layout.adapter_test, viewGroup, false);
return new BaseViewHolder(itemView, new IMyViewHolderClicks() {
@Override
public void onItemClick(String uid) {
// 跳轉到個人信息頁,根據uid獲取個人信息
}
//如果需要刷新某個特定界面,則參數中包含position
@Override
public void onFollowStatusChange(final User user,final int position) {
//與服務器交互,如果成功,刷新當前按鈕文字的 "關注"爲"已關注"
notifyItemChanged(position);
}
});
}
@Override
public void onBindViewHolder(final BaseViewHolder baseViewHolder,final int position) {
User user = mList.get(position);
baseViewHolder.bind(user);
}
@Override
public int getItemCount() {
return mList.size();
}
public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView tvFollowStatus; //關注按鈕
LinearLayout linearContainer; //整個item的根佈局
IMyViewHolderClicks mListener;
public BaseViewHolder(View v,IMyViewHolderClicks listener) {
super(v);
tvFollowStatus = (TextView)v.findViewById(R.id.tv_follow_status);
linearContainer = (LinearLayout)v.findViewById(R.id.linear_container);
mListener = listener;
tvFollowStatus.setOnClickListener(this);
linearContainer.setOnClickListener(this);
}
public void bind(User user) {
if(user.getIs_attention()==1){
tvFollowStatus.setText("已關注");
}else{
tvFollowStatus.setText("加關注");
}
//將實體綁定到view上面
tvFollowStatus.setTag(user);
tvFollowStatus.setClickable(true);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tv_follow_status:
tvFollowStatus.setClickable(false);
mListener.onFollowStatusChange((User) tvFollowStatus.getTag(),getLayoutPosition());
break;
case R.id.linear_container:
mListener.onItemClick(((User)tvFollowStatus.getTag()).getId());
break;
}
}
}
private interface IMyViewHolderClicks{
//單擊整個item跳轉到用戶界面,需要傳遞uid
public void onItemClick(String uid);
//關注按鈕,需要更新按鈕的狀態
public void onFollowStatusChange(User user,int position);
}
}
以前在經常在綁定數據(bindViewHolder)中加入setOnClickListener(new View.OnClickListener),這樣每次都創建會很影響效率。