天天看點

RecycleView 清單的item點選事件

在工作中,用到橫向滑動,選擇年份且選擇的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點選監聽事件

繼續閱讀