I'm retrieving some data from Firebase
and showing it using RecyclerView
.
My RecyclerView
has cards in it in which the text and images are getting retrieved.
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.
Here's my code:
@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();
}
}
});
}
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();
}
Here's startFloatyForAboveAndroidL()
:
@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);
}
here's 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?
Aucun commentaire:
Enregistrer un commentaire