在工作中,用到橫向滑動,選擇年份且選擇的item變色的功能,就想到了RecycleView可以完成橫向滑動,結果在使用時發現,布局雖然沒有問題,但是RecycleView沒有item點選事件,更不用說類似于RadioButton的單選,後經查詢,網上建議,可自己寫接口回調,完成item的點選事件,後根據這一思路,完成item點選事件以及item的單選,以下為代碼:
Adapter的代碼:
public class RecycleSelectDateAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private List<String> listYears;//年份清單(最近三年)
private Context context;
private OnRecycleItemClickListener mListener;//設定item點選監聽事件
private List<Boolean> list_click=new ArrayList<>();//判斷該item 是否被點選
public RecycleSelectDateAdapter(Context context) {
listYears=new ArrayList<>();
int year_now= Integer.parseInt(Utils.getCustonFormatTime("yyyy"));
listYears.add(year_now-3+"");
listYears.add(year_now-2+"");
listYears.add(year_now-1+"");
listYears.add(year_now+"");
listYears.add(year_now+1+"");
listYears.add(year_now+2+"");
listYears.add(year_now+3+"");
resetIsClick();
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.recy_year_item,parent,false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final MyViewHolder myHolder=(MyViewHolder) holder;
myHolder.tv_time_year.setText(listYears.get(position));
if (!list_click.get(position)){
myHolder.tv_time_year.setTextColor(Color.BLACK);
}else {
myHolder.tv_time_year.setTextColor(Color.WHITE);
}
myHolder.tv_time_year.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mListener!=null){
resetIsClick();
list_click.remove(position);
list_click.add(position,true);
mListener.onItemCiclk(position,myHolder.tv_time_year);
notifyDataSetChanged();
}
}
});
}
@Override
public int getItemCount() {
return listYears.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv_time_year;
// List<Boolean> booleans=new ArrayList<>();
public MyViewHolder(View itemView) {
super(itemView);
tv_time_year=(TextView) itemView.findViewById(R.id.tv_time_year);
}
}
//設定監聽
public void setOnItemClickListener(OnRecycleItemClickListener listener){
mListener=listener;
}
//重置判斷是否被監聽
public void resetIsClick(){
list_click.clear();
for (int i=0;i<listYears.size();i++){
list_click.add(false);
}
}
public interface OnRecycleItemClickListener{
void onItemCiclk(int pos,TextView textView);
}
}
該部分代碼,主要功能的實作邏輯在 onBindViewHolder()中,當TextView被點選時,即傳入接口回調,其中list_click集合為記錄哪個位置的item被點選,然後調用 notifyDataSetChanged();重新重新整理adapter的事件,在調用該方法時,adapter的構造方法會執行一次,MyViewHolder會執行一次,onBindViewHolder()會執行全部次數;
下列為Activity中的代碼:
//設定布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerview_year.setLayoutManager(linearLayoutManager);
dateAdapter=new RecycleSelectDateAdapter(this);
recyclerview_year.setAdapter(dateAdapter);
//監聽點選的item
dateAdapter.setOnItemClickListener(new RecycleSelectDateAdapter.OnRecycleItemClickListener() {
@Override
public void onItemCiclk(int pos, TextView textView) {
str_year=textView.getText().toString()+"年";
if (TextUtils.isEmpty(str_month)){//未選擇月
tv_title_name.setText(str_year);
}else {
tv_title_name.setText(str_year+str_month);
}
}
});
此時完成了adapter的item點選監聽事件