在 RecyclerView 本身而不是在项目上设置 OnClickListener

Moh*_*adL 7 android onclicklistener android-recyclerview

我想OnClickListener在 a设置一个RecyclerView而不是在它的项目上设置,以便在用户点击时触发点击事件RecyclerView(即使它是空的或充满项目)。

  • 我正在使用 MVVM
  • 我试过了mRecyclerView.setClickable(true),不行

我想要的是

mRecyclerView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // do something
    }
});
Run Code Online (Sandbox Code Playgroud)

我的适配器类

public class TaskItemAdapter extends RecyclerView.Adapter<TaskItemAdapter.BaseItemAdapterViewHolder> {
    private static final String TAG = TaskItemAdapter.class.getSimpleName();
    private List<Task> mTaskList;
    private View.OnLongClickListener mOnLongClickListener;

    public TaskItemAdapter(List<Task> taskList, View.OnLongClickListener longClickListener) {
        mTaskList = taskList;
        mOnLongClickListener = longClickListener;
    }

    @NonNull
    @Override
    public BaseItemAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (parent instanceof RecyclerView) {
            int layoutId = R.layout.item_list_main;
            View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
            view.setFocusable(true);
            return new BaseItemAdapterViewHolder(view);

        } else {
            throw new RuntimeException(TAG + "Not bound to recyclerView");
        }
    }

    @Override
    public void onBindViewHolder(@NonNull BaseItemAdapterViewHolder holder, int position) {
        Task task = mTaskList.get(position);
        holder.mItemTextView.setText("- " + task.getName());

        holder.itemView.setTag(task);
        holder.itemView.setOnLongClickListener(mOnLongClickListener);
    }

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

    public void loadItems(List<Task> taskList) {
        mTaskList = taskList;
        notifyDataSetChanged();
    }

    public class BaseItemAdapterViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.item_textView)
        TextView mItemTextView;

        public BaseItemAdapterViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Moh*_*adL 0

我设法做到这一点:

我将两个侦听器传递给适配器:

View.OnClickListener;
View.OnTouchListener;
Run Code Online (Sandbox Code Playgroud)

在方法中onCreateViewHolder,我设置了两个侦听器并将 recyclerViewID 传递到标记中。

int layoutId = R.layout.item_list_main;
View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
view.setFocusable(true);
parent.setOnTouchListener(mOnTouchListener);
view.setTag(R.id.PARENT_VIEW_ID, parent.getId());
view.setOnClickListener(mOnClickListener);
return new BaseItemAdapterViewHolder(view);
Run Code Online (Sandbox Code Playgroud)

在主要活动中:

  1. View.OnTouchListener在recyclerView本身的空白空间中操作。
  2. View.OnClickListener在recyclerView的items中进行操作。
  3. 并使用了一个空布局点击监听器。

因此,现在无论用户点击 recyclerView 或其项目,或其空状态,它都会触发整个点击。