【问题标题】:onClickListener in RecyclerView adapter?RecyclerView 适配器中的 onClickListener?
【发布时间】:2015-10-23 03:54:31
【问题描述】:

我想在我的 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();
    }

}

【问题讨论】:

    标签: android android-intent android-activity android-recyclerview


    【解决方案1】:

    我想提出一种比上面给出的方法更简单的方法。 在您的适配器中,您将为此编写静态视图持有者类,添加以下代码

    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;
                }
            }
        }
    

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

    【讨论】:

    • 我想你忘了设置监听器
    【解决方案2】:

    您可以为此使用 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 
                }
            }));
    

    注意:概念取自LINK

    【讨论】:

    【解决方案3】:

    这是最简单的实现,但这将在 recyclerviews 适配器中。如果您想在活动中获取行项点击侦听器,请使用接口。

    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();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多