单击按钮后如何从各自的recyclerview项目中获取各自的文本和图像? [英] How to get respective text and image from the respective recyclerview item in floaty upon clicking a button?

查看:84
本文介绍了单击按钮后如何从各自的recyclerview项目中获取各自的文本和图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从Firebase中检索一些数据,并使用RecyclerView进行显示.

I'm retrieving some data from Firebase and showing it using RecyclerView.

我的RecyclerView上有卡片,可以在其中检索文本和图像.

My RecyclerView has cards in it in which the text and images are getting retrieved.

卡上有一个按钮,该按钮开始蓬松.浮动对象具有ImageViewTextView,其中应显示单击了按钮的卡片中的图像和文本.

The card has a button on it which starts a floaty. The floaty has a ImageView and a TextView in which the image and text from the card from which the button was clicked should be shown.

问题是,当单击第一张卡片的按钮时,浮动图标开始启动并显示相应卡片的图像和文本,但是当我按下另一张卡片的按钮以启动浮动图标时,浮动图标会启动,但是相应卡中的图像和文字未显示在其中.

The problem is that when clicking that button of the first card, the floaty is getting started and showing the image and text from that respective card, but when I press the button of another cards to start the floaty, floaty starts but the image and text from the respective card is not shown in it.

这是我的代码:

@Override
    public void bindView(final ViewHolder holder) {
        super.bindView(holder);

       holder.progressBar.findViewById(R.id.progressBar_loading_image);
        holder.imageUID.setText(imageUIDh);
        holder.hDescription.setText(hDescription);

        if (imageUIDh != null) {

            holder.progressBar.setVisibility(View.VISIBLE);

            if (imageUIDh.startsWith("https://firebasestorage.googleapis.com/") || imageUIDh.startsWith("content://")) {
                Picasso.with(holder.itemView.getContext()).cancelRequest(holder.homelessImage);
                Picasso.with(holder.itemView.getContext())
                        .load(imageUIDh)
                        .error(R.drawable.ic_warning_black_24dp)
                        .into(holder.homelessImage, new Callback() {
                    @Override
                    public void onSuccess() {
                        holder.progressBar.setVisibility(View.INVISIBLE);
                    }

                    @Override
                    public void onError() {
                        // TODO Auto-generated method stub
                        Toast.makeText(holder.itemView.getContext(), "Error occurred while loading images. Please retry.", Toast.LENGTH_SHORT).show();
                    }
                });



                final View head = LayoutInflater.from(holder.itemView.getContext()).inflate(R.layout.widget_chathead, null);

                final View body = LayoutInflater.from(holder.itemView.getContext()).inflate(R.layout.content_help_request_chat_head, null);

                holder.progressBar2 = (ProgressBar) body.findViewById(R.id.progressBar_loading_image_ch);
                final ImageView hImageInFloaty = (ImageView) body.findViewById(R.id.hImageHF);
                final TextView hDescriptionInFloaty = (TextView) body.findViewById(R.id.hDescriptionHF);

                holder.btn_accept = (Button) holder.itemView.findViewById(R.id.btn_accept);
                holder.btn_accept.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        if (holder.isNetworkAvailable()) {
                            AlertDialog.Builder builder = new AlertDialog.Builder(holder.itemView.getContext());
                            builder.setMessage(R.string.request_accepted_txt);
                            builder.setPositiveButton("Yes button", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {

                                            holder.floaty = Floaty.createInstance(holder.itemView.getContext(), head, body, holder.NOTIFICATION_ID, notification);
                                            holder.floaty.startService();
                                            hDescriptionInFloaty.setText(holder.hDescription.getText().toString());
                                            Picasso.with(holder.itemView.getContext())
                                                    .load(imageUIDh)
                                                    .error(R.drawable.ic_warning_black_24dp)
                                                    .into(hImageInFloaty, new Callback() {
                                                        @Override
                                                        public void onSuccess() {
                                                            holder.progressBar2.setVisibility(View.GONE);
                                                        }

                                                        @Override
                                                        public void onError() {
                                                            // TODO Auto-generated method stub

                                                        }
                                                    });

                                }

                            });
                            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    Toast.makeText(holder.itemView.getContext(), "The help-request has been rejected.", Toast.LENGTH_LONG).show();
                                }
                            });
                            AlertDialog dialog = builder.create();
                            dialog.show();
                        } else {
                            android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(holder.itemView.getContext());
                            builder.setTitle("No internet connection!");
                            builder.setMessage("We need internet connection to navigate you more accurately. Please connect to the internet and then accept the help-request.");
                            builder.setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    Intent intent = new Intent(Settings.ACTION_SETTINGS);
                                    holder.itemView.getContext().startActivity(intent);
                                }
                            });
                            builder.setNegativeButton("Cancel", null);
                            builder.show();
                        }

                    }
                });

    }

由于浮动对象需要权限,因此在获得权限后,我将填充recyclerview(仅适用于Android M及更高版本).这是代码:

As floaties need permission, I'm populating recyclerview after getting the permission (for Android M and above only). Here's the code:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            startFloatyForAboveAndroidL();
        }

这里是s tartFloatyForAboveAndroidL():

@TargetApi(Build.VERSION_CODES.M)
    public void startFloatyForAboveAndroidL() {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, PERMISSION_REQUEST_CODE);
        } else {
            recyclerView.setAdapter(fastItemAdapter);
        }
    }

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUEST_CODE){
            mSheetLayout.contractFab();
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (requestCode == PERMISSION_REQUEST_CODE) {
                if (Settings.canDrawOverlays(this)) {
                    recyclerView.setAdapter(fastItemAdapter);
                } else {
                    Spanned message = Html.fromHtml("Please allow this permission, so <b>Floaties</b> could be drawn.");
                    Toast.makeText(this, message, Toast.LENGTH_LONG).show();
                }
            }
        }
    }

尝试埃里克答案后的

代码:-

code after trying Eric's answer:--

protected static class ViewHolder extends RecyclerView.ViewHolder {

        ImageView hImage;
        TextView imageUID, hDescription;
        View head, body;
        Floaty floaty;
        TextView hDescroptionInFloaty;
        ImageView hImageInFloaty;
        Notification notification;
        Button btn_accept;
        ProgressBar progressBar, progressBar2;
        AppCompatButton btnCloseFloaty;
        private static final int NOTIFICATION_ID = 1500;

        public ViewHolder(final View itemView) {
            super(itemView);

            Intent intent = new Intent(itemView.getContext(), HelpRequest.class);
            PendingIntent resultPendingIntent = PendingIntent.getActivity(itemView.getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            notification = Floaty.createNotification(itemView.getContext(), "HumaneHelper", "Floaty has started with homeless's pic and description", R.mipmap.ic_launcher, resultPendingIntent);

            head = LayoutInflater.from(itemView.getContext()).inflate(R.layout.widget_chathead, null);
            // You should not add click listeners to head as it will be overridden, but the purpose of not making head just
            // an ImageView is so you can add multiple views in it, and show and hide the relevant views to notify user etc.
            body = LayoutInflater.from(itemView.getContext()).inflate(R.layout.content_help_request_chat_head, null);

            floaty = Floaty.createInstance(itemView.getContext(), head, body, NOTIFICATION_ID, notification);

            btnCloseFloaty = (AppCompatButton) body.findViewById(R.id.btn_close_floaty);
            btnCloseFloaty.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    floaty.stopService();
                }
            });

            hDescroptionInFloaty = (TextView) body.findViewById(R.id.hDescriptionHF);
            hImageInFloaty = (ImageView) body.findViewById(R.id.hImageHF);

    }

这里是bindView():

    @Override
        public void bindView(final ViewHolder holder) {
            super.bindView(holder);
    holder.imageUID.setText(imageUIDh);
            holder.hDescription.setText(hDescription);

    if (imageUIDh != null) {

                    holder.progressBar2 = (ProgressBar) holder.body.findViewById(R.id.progressBar_loading_image_ch);

                    holder.btn_accept = (Button) holder.itemView.findViewById(R.id.btn_accept);
   View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            if (holder.isNetworkAvailable()) {

                                holder.hDescroptionInFloaty.setText(holder.hDescription.getText().toString());
                                Picasso.with(holder.itemView.getContext())
                                        .load(imageUIDh)
                                        .error(R.drawable.ic_warning_black_24dp)
                                        .into(holder.hImageInFloaty, new Callback() {
                                            @Override
                                            public void onSuccess() {
                                                holder.progressBar2.setVisibility(View.GONE);
                                            }

                                            @Override
                                            public void onError() {
                                                // TODO Auto-generated method stub

                                            }
                                        });
                                Toast.makeText(holder.itemView.getContext(), "updated: " + holder.homelessDescroptionInFloaty.getText(), Toast.LENGTH_LONG).show();

                                AlertDialog.Builder builder = new AlertDialog.Builder(holder.itemView.getContext());
                                builder.setMessage(R.string.request_accepted_txt);
                                builder.setPositiveButton("Navigate me", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {

                                                holder.floaty = Floaty.createInstance(holder.itemView.getContext(), holder.head, holder.body, holder.NOTIFICATION_ID, holder.notification);
                                                holder.floaty.startService();

                                    }

                                });
                                builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        Toast.makeText(holder.itemView.getContext(), "The help-request has been rejected.", Toast.LENGTH_LONG).show();
                                    }
                                });
                                AlertDialog dialog = builder.create();
                                dialog.show();
                            } else {
                                android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(holder.itemView.getContext());
                                builder.setTitle("No internet connection!");
                                builder.setMessage("We need internet connection to navigate you more accurately. Please connect to the internet and then accept the help-request.");
                                builder.setPositiveButton("Open Settings", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i) {
                                        Intent intent = new Intent(Settings.ACTION_SETTINGS);
                                        holder.itemView.getContext().startActivity(intent);
                                    }
                                });
                                builder.setNegativeButton("Cancel", null);
                                builder.show();
                            }

                        }
                    });

                } else {
                    Toast.makeText(holder.itemView.getContext(), "some problem", Toast.LENGTH_SHORT).show();
                }
        }

这是怎么回事?如何从单击其按钮的卡中获取文本和图像?

What is happening wrong here? How can I get the text and image from the card of whose button was clicked into the floaty?

推荐答案

如果您查看Floaty代码

If you take a look at the Floaty code here. You will notice it uses SingletonPattern. Hence that is the reason it works for the first time but after that, it shows incorrect data. One solution that comes is to extend the Floaty class, and add your own createInstance method. The body of method would be something like this:

public static synchronized Floaty createInstance(Context context, View head, View body, int notificationId, Notification notification, FloatyOrientationListener
        floatyOrientationListener) {
    if (floaty == null) {
        floaty = new Floaty(context, head, body, notificationId, notification, floatyOrientationListener);
    }else {
        floaty.stopService();
        floaty = null;
        floaty = new Floaty(context, head, body, notificationId, notification, floatyOrientationListener);
    }
    return floaty;
}

我希望这行得通.

方法2

想到的另一个更简单的方法是,仅将Floaty初始化一次.然后,只需引用您的容器中的正文,然后从您的容器中修改ImageView和TextView即可.

Another simpler, approach that comes to mind is, you initialize the Floaty only once. Then just get reference to the body in your holder and modify the ImageView and the TextView from your holder.

这篇关于单击按钮后如何从各自的recyclerview项目中获取各自的文本和图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆