简体   繁体   English

Recycler 视图 Onclick 打开对话框,在卡片视图中显示数据

[英]Recycler view Onclick to open dialog with data present on card view

I'm trying to implement Onclick on my RecyclerView .我正在尝试在我的RecyclerView上实现 Onclick 。 I tried many ways of doing it, but it ends up crashing my application.我尝试了很多方法,但最终导致我的应用程序崩溃。 I also would like to have a dialog when any of the cardView is clicked.我还希望在单击任何cardView时有一个对话框。

I'm using fireBase as my backend, and I'm quite new to this.我使用 fireBase 作为我的后端,我对此很陌生。

Here's my Adapter class:这是我的适配器类:

public class BlogRecyclerAdapter extends RecyclerView.Adapter<BlogRecyclerAdapter.ViewHolder> {
    public List<BlogPost>blogList;
    public Context context;
    private FirebaseFirestore firebaseFirestore;

    private static final int SECOND_MILLIS = 1000;
    private static final int MINUTE_MILLIS = 60 * SECOND_MILLIS;
    private static final int HOUR_MILLIS = 60 * MINUTE_MILLIS;
    private static final int DAY_MILLIS = 24 * HOUR_MILLIS;
    String dateString;

    public  BlogRecyclerAdapter(List<BlogPost>blogList){
        this.blogList=blogList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.blog_list_item,parent,false);
        context=parent.getContext();
        firebaseFirestore=FirebaseFirestore.getInstance();
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
        String descData=blogList.get(position).getDesc();
        holder.setDescText(descData);
        String imageUrl=blogList.get(position).getImage_url();
        holder.setBlogImage(imageUrl);
        final String userId=blogList.get(position).getUser_id();
        firebaseFirestore.collection("Users").document(userId).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if(task.isSuccessful()){
                    String username=task.getResult().getString("Name");
                    holder.setUserData(username);
                }
                else{

                }
            }
        });

        long miliseconds=blogList.get(position).getTimestamp().getTime();
        long now = System.currentTimeMillis();

        final long diff = now - miliseconds;
        if (diff < MINUTE_MILLIS) {
             dateString= "just now";
        } else if (diff < 2 * MINUTE_MILLIS) {
             dateString= "a minute ago";
        } else if (diff < 50 * MINUTE_MILLIS) {
             dateString= diff / MINUTE_MILLIS + " minutes ago";
        } else if (diff < 90 * MINUTE_MILLIS) {
             dateString= "an hour ago";
        } else if (diff < 24 * HOUR_MILLIS) {
             dateString= diff / HOUR_MILLIS + " hours ago";
        } else if (diff < 48 * HOUR_MILLIS) {
             dateString= "yesterday";
        } else {
             dateString= diff / DAY_MILLIS + " days ago";
        }
        // String dateString= DateFormat.format("MM/dd/yyyy",new Date(miliseconds)).toString();
        holder.setTime(dateString);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        private View mView;
        private TextView descView;
        private ImageView blogImageView;
        private TextView blogDate;
        private TextView blogUserName;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mView=itemView;
        }

        public void setUserData(String name){
            blogUserName=mView.findViewById(R.id.blogUserName);
            blogUserName.setText(name);
        }

        public void setDescText(String descText){
            descView=mView.findViewById(R.id.blogDesc);
            descView.setText(descText);
        }

        public void setBlogImage(String downloaduri){
            blogImageView=mView.findViewById(R.id.blogImage);
            Glide.with(context).load(downloaduri).apply(RequestOptions.bitmapTransform(new BlurTransformation(30,3))).into(blogImageView);
        }

        public void setTime(String date){
            blogDate=mView.findViewById(R.id.blogDate);
            blogDate.setText(date);
        }
    }
}

I tried many methods of implementing, it but was unsuccessful.我尝试了很多实现方法,但都没有成功。

Adding onClickListener to RecyclerView is a painful process than ListView. 与ListView相比,将onClickListener添加到RecyclerView是一个痛苦的过程。 But there is a way to do it. 但是有一种方法可以做到。

  1. Firstly, add this class to your adapter. 首先,将此类添加到适配器。

     public static class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); public void onLongItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { mListener = listener; mGestureDetector = 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 && mListener != null) { mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); return true; } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){} } 
  2. Secondly, add this listener to your activity/fragment 其次,将此监听器添加到您的活动/片段中

     recyclerView.addOnItemTouchListener(new BlogRecyclerAdapter.RecyclerItemClickListener(getActivity(), recyclerView ,new BlogRecyclerAdapter.RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { // Do something here... } @Override public void onLongItemClick(View view, int position) { } }) ); 

First of all, to apply ClickListeners to items(cardviews), because RecyclerView doesnt have default ones, you need to do the following: 首先,要将ClickListener应用于项目(卡片视图),因为RecyclerView没有默认项目,因此您需要执行以下操作:

  1. Define public interface inside your adapter with functions u need(ex: OnClick()) 使用所需的功能在适配器内部定义公共接口(例如:OnClick())
  2. Implement that interface in your activity 在您的活动中实现该界面
  3. Modify your adapters constructor so it receives instance of that interface( your activity coz its implementing it) and declare member variable listener of type of interface you declared 修改您的适配器构造函数,使其接收该接口的实例(您的活动可以实现该接口的实例),并声明您声明的接口类型的成员变量侦听器
  4. Pass that your activity as an argument when initializing adapter ex. 在初始化adapter ex时将您的活动作为参数传递。 adapter = BlogrecyclerAdapter(this) 5.Make your your blog_list_item clickable in xml 6.set clickListener to you items rootview holder.itemview.setOnClickListener((View)-> listener.OnClick()) adapter = BlogrecyclerAdapter(this)5.使您的blog_list_item在xml中可单击6.将clickListener设置为您的项目rootviewholder.itemview.setOnClickListener((View)-> listener.OnClick())
    1. You can pass some arguments to OnClick if u need 您可以根据需要将一些参数传递给OnClick

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM