Android RecyclerView适配器中的onClickListener?

Android RecyclerView适配器中的onClickListener?,android,android-intent,android-activity,android-recyclerview,Android,Android Intent,Android Activity,Android Recyclerview,我想在我的RecyclerView适配器中设置一个onClickListener,这样我就可以轻松地引用其他视图来检索它们的标记 是否可以在RecyclerView适配器中设置onClickListener?我该怎么做?它会影响性能吗 这是我的RecyclerView适配器: public class PostRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerAdapter.ViewHolder> { priv

我想在我的RecyclerView适配器中设置一个onClickListener,这样我就可以轻松地引用其他视图来检索它们的标记

是否可以在RecyclerView适配器中设置onClickListener?我该怎么做?它会影响性能吗

这是我的RecyclerView适配器:

public class PostRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerAdapter.ViewHolder> {

    private Context context;
    private List<Post> mDataset;

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
        public LinearLayout mainLayout;
        public TextView username;
        public ImageView image;

        public ViewHolder(LinearLayout view) {
            super(view);
            view.setOnCreateContextMenuListener(this);

            mainLayout = (LinearLayout) view.findViewById(R.id.main_view);
            username = (TextView) view.findViewById(R.id.username);
            image = (ImageView) view.findViewById(R.id.image);
        }
    }

    public PostRecyclerAdapter(Context context, List<Post> myDataset) {
        this.context = context;
        this.mDataset = myDataset;
    }

    @Override
    public PostRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_layout, parent, false);
        ViewHolder vh = new ViewHolder((LinearLayout) view);

        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Post postItem = mDataset.get(position);

        holder.username.setText(postItem.getUserame());
    }

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

}
公共类PostRecyclerAdapter扩展了RecyclerView.Adapter{
私人语境;
私有列表数据集;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnCreateContextMenuListener{
公共线路布局主要布局;
公共文本视图用户名;
公众形象;
公共视图持有者(线性布局视图){
超级(视图);
view.setOnCreateContextMenuListener(此);
mainLayout=(LinearLayout)视图。findViewById(R.id.main\u视图);
username=(TextView)view.findViewById(R.id.username);
image=(ImageView)view.findviewbyd(R.id.image);
}
}
公共PostRecyclerAdapter(上下文,列表myDataset){
this.context=上下文;
this.mDataset=myDataset;
}
@凌驾
public PostRecyclerAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.post_布局,parent,false);
ViewHolder vh=新的ViewHolder((线性布局)视图);
返回vh;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
Post positem=mDataset.get(位置);
holder.username.setText(positem.getUserName());
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
}

您可以使用GestureDetector进行此操作。这很容易使用:

创建一个类RecyclerTouchListener:

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private ClickListener clickListener;

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }


    public interface ClickListener {

        void onClick(View view, int position);

        void onLongClick(View view, int position);
    }

}
您可以按如下方式使用该类:

rvFilterOptions = (RecyclerView) rootView.findViewById(R.id.rvCommon);
        rvFilterOptions.setHasFixedSize(true);
        rvFilterOptions.addItemDecoration(new DividerItemDecoration(getActivity(),
                DividerItemDecoration.VERTICAL_LIST));
        LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        rvFilterOptions.setLayoutManager(mLayoutManager);


        rvFilterOptions.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), rvFilterOptions, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {

// Perform click operation  and you can get post item from array using position
            }

            @Override
            public void onLongClick(View view, int position) {

// Perform Long click operation 
            }
        }));

注:概念取自

,我想建议一种比上述方法简单得多的方法。 在适配器中,您应该已经编写了静态视图持有者类,并添加了以下代码

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
       // your views declared here           
        CardView cardView;

        public ViewHolder(View itemView) {
            super(itemView);                
           // your view initialised here
              cardView=itemView.findViewById(R.id.card_view);
              cardView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.card_view:
                    // your logic
                break;
            }
        }
    }

通过这样做,您可以处理布局的单个单击以及整个布局单击

这是最简单的实现,但这将在recyclerviews适配器内部。若要在活动中获取行项目clicklistener,请使用界面

public class PostRecyclerAdapter extends RecyclerView.Adapter<PostRecyclerAdapter.ViewHolder> {

    private Context context;
    private List<Post> mDataset;

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
        public LinearLayout mainLayout;
        public TextView username;
        public ImageView image;
        public View mRowItem;   

        public ViewHolder(LinearLayout view) {
            super(view);
            view.setOnCreateContextMenuListener(this);
            mRowItem = view;
            mainLayout = (LinearLayout) view.findViewById(R.id.main_view);
            username = (TextView) view.findViewById(R.id.username);
            image = (ImageView) view.findViewById(R.id.image);
        }
    }

    public PostRecyclerAdapter(Context context, List<Post> myDataset) {
        this.context = context;
        this.mDataset = myDataset;
    }

    @Override
    public PostRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_layout, parent, false);
        ViewHolder vh = new ViewHolder((LinearLayout) view);


        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Post postItem = mDataset.get(position);

        holder.username.setText(postItem.getUserame());

        //Whole row item
        holder.mRowItem.setTag(position);
        holder.mRowItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  int pos = (int) v.getTag();
                  // handle your row item click.
              }
           });

    }

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

}
公共类PostRecyclerAdapter扩展了RecyclerView.Adapter{
私人语境;
私有列表数据集;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnCreateContextMenuListener{
公共线路布局主要布局;
公共文本视图用户名;
公众形象;
公众视野项目;
公共视图持有者(线性布局视图){
超级(视图);
view.setOnCreateContextMenuListener(此);
mRowItem=视图;
mainLayout=(LinearLayout)视图。findViewById(R.id.main\u视图);
username=(TextView)view.findViewById(R.id.username);
image=(ImageView)view.findviewbyd(R.id.image);
}
}
公共PostRecyclerAdapter(上下文,列表myDataset){
this.context=上下文;
this.mDataset=myDataset;
}
@凌驾
public PostRecyclerAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.post_布局,parent,false);
ViewHolder vh=新的ViewHolder((线性布局)视图);
返回vh;
}
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
Post positem=mDataset.get(位置);
holder.username.setText(positem.getUserName());
//整行项目
holder.mRowItem.setTag(位置);
holder.mRowItem.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int pos=(int)v.getTag();
//单击以处理行项目。
}
});
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
}

是否有必要使用GestureDetector彻底检修适配器,以便为视图获取一个简单的onClickListener事件?我想您忘记了设置listener