RecyclerView的使用與添加單擊(長按)監聽事件

使用

  1、添加依賴
    無論從IDE設置項目環境中搜索添加依賴還是在Gradle的配置文件中添加均可,是標準的RecyclerView就行
    因爲沒有找到網上所謂的v7支持包中的,個人使用最新androidx合成系列中的RecyclerView

implementation ‘androidx.recyclerview:recyclerview:1.1.0’

  2、資源文件
    (具體配置項視個人佈局而定)

<androidx.recyclerview.widget.RecyclerView
app:layout_constraintTop_toTopOf=“parent”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:id="@+id/search_list"/>

  3、定義適配器

//先定義ViewHolder佈局塊類,再寫入泛型
public class JobsAdapter extends RecyclerView.Adapter<JobsAdapter.ViewHolder> {
    private List<Job> jobs;

    public JobsAdapter(List<Job> jobList){
        jobs = jobList;
    }
    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView jobCategory,jobDuration,jobPosition,jobSalary,jobDate;
        private ViewHolder (View view) {
            super(view);
            jobCategory = view.findViewById(R.id.job_category);
            jobDuration = view.findViewById(R.id.job_duration);
            jobPosition = view.findViewById(R.id.job_position);
            jobSalary = view.findViewById(R.id.job_salary);
            jobDate = view.findViewById(R.id.job_date);
        }
    }
    
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_job,parent,false);
        return new ViewHolder(view,onItemClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Job job = jobs.get(position);
        holder.jobCategory.setText(job.getCategory());
        holder.jobDuration.setText(job.getDuration());
        holder.jobSalary.setText(job.getSalary());
        holder.jobDate.setText(job.getDate());
    }

    @Override
    public int getItemCount() {
        return jobs.size();
    }
}

實現監聽

  因爲RecyclerView並沒有自帶的單擊長按事件監聽,主要通過個人自定義實現:
  1、自定義監聽

在適配器中定義接口與方法
在ViewHolder實現單擊事件的回調
這樣通過適配器設置了監聽器,每個ViewHolder被點擊都會使用onItemClick接口方法(個人重寫)

public class JobsAdapter extends RecyclerView.Adapter<JobsAdapter.ViewHolder> {
    private List<Job> jobs;
    private OnItemClickListener onItemClickListener;

    public JobsAdapter(List<Job> jobList){
        jobs = jobList;
    }
    static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView jobCategory,jobDuration,jobPosition,jobSalary,jobDate;
        OnItemClickListener onItemClickListener;
        private ViewHolder (View view,OnItemClickListener onItemClickListener) {
            super(view);
            jobCategory = view.findViewById(R.id.job_category);
            jobDuration = view.findViewById(R.id.job_duration);
            jobPosition = view.findViewById(R.id.job_position);
            jobSalary = view.findViewById(R.id.job_salary);
            jobDate = view.findViewById(R.id.job_date);
            this.onItemClickListener = onItemClickListener;
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(onItemClickListener != null)
                onItemClickListener.onItemClick(getAdapterPosition());
        }
    }
    public interface  OnItemClickListener{
        void onItemClick(int postion);
    }
    public void setItemClickListener(OnItemClickListener onItemClickListener){
        this.onItemClickListener = onItemClickListener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_job,parent,false);
        return new ViewHolder(view,onItemClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Job job = jobs.get(position);
        holder.jobCategory.setText(job.getCategory());
        holder.jobDuration.setText(job.getDuration());
        holder.jobSalary.setText(job.getSalary());
        holder.jobDate.setText(job.getDate());
    }


    @Override
    public int getItemCount() {
        return jobs.size();
    }
}
JobsAdapter adapter = new JobsAdapter(jobs);
adapter.setItemClickListener(new JobsAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(int postion) {
        Intent intent = new Intent(SearchActivity.this,DetailActivity.class);
        intent.putExtra("job",jobs.get(postion));
        startActivity(intent);
    }
});
searchList.setAdapter(adapter);

  2、使用OnItemTouchListener攔截動作進行控制(暫時沒有研究)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章