Code to upload image using Firebase:
Button btnUpload = (Button)findViewById(R.id.btn_upload_image);
btnUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_LOCAL_ONLY,true);
startActivityForResult(Intent.createChooser(intent,getString(R.string.str_complete_action)),RC_PHOTO_PICKER);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RC_PHOTO_PICKER && resultCode == RESULT_OK)
{
pbLoader.setVisibility(View.VISIBLE);
Uri selectedImageUri = data.getData();
StorageReference photoReference = mStorageReference.child(getString(R.string.str_images)+selectedImageUri.getLastPathSegment());
photoReference.putFile(selectedImageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUri = taskSnapshot.getDownloadUrl();
MessageModelClass messageModelClass = new MessageModelClass();
messageModelClass.setImageUrl(downloadUri.toString());
messageModelClass.setmMessage(null);
messageModelClass.setmUserName(userName);
mDatabaseReference.push().setValue(messageModelClass);
messageAdapter.notifyDataSetChanged();
}
}).addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG,"onFailure:"+e.getMessage());
}
}).addOnCompleteListener(this, new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
// messageAdapter.notifyDataSetChanged();
pbLoader.setVisibility(View.GONE);
Log.d(TAG,"onComplete:");
}
});
}
In process of sending message whenever i am sending any text its displaying in my recycler twice if 3 images are in pending and i am sending some text then text is being displayed thrice in recyclerview while its only showing data insert once in firebase console. when i restart app again then its showing exact no of messages. What is the reason of showing text or images multiple times?
Recyclercode :
private void initRecyclerView() {
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rvMessage.setLayoutManager(layoutManager);
messageList = new ArrayList<>();
messageList.clear();
messageAdapter = new MessageAdapter(context, messageList , userName ,confirmationDialogListener);
rvMessage.setAdapter(messageAdapter);
messageAdapter.notifyDataSetChanged();
}
@Override
public void onBindViewHolder(final MessageAdapter.MyViewHolder holder, final int position) {
final MessageModelClass messageModelClass = messageModelList.get(position);
if (messageModelClass.getmTimeDate() != null) {
setTimeFormatInUI(messageModelClass.getmTimeDate(), holder);
}
if (messageModelClass.getImageUrl() != null) {
holder.tvMessage.setVisibility(View.GONE);
holder.ivPhoto.setVisibility(View.VISIBLE);
holder.ivPhoto.setTag(messageModelClass.getmKey());
Picasso.with(context).load(messageModelClass.getImageUrl()).into(holder.ivPhoto);
} else {
holder.ivPhoto.setVisibility(View.GONE);
holder.tvMessage.setVisibility(View.VISIBLE);
holder.tvMessage.setTag(messageModelClass.getmKey());
holder.tvMessage.setText(messageModelClass.getmMessage());
}
if(messageModelClass.getmUserName() != null)
{
if(userName.equals(messageModelClass.getmUserName()))
{
holder.tvUserName.setText("You");
}
else
{
holder.tvUserName.setText(messageModelClass.getmUserName());
}
}
}
code for chileEventListener :
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mDatabaseReference;
mFirebaseDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mFirebaseDatabase.getReference().child(getString(R.string.str_messages));
private void attachDatabaseReadListener() {
Log.d(TAG,"attachDatabaseReadListener:");
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
MessageModelClass messageModelClass = dataSnapshot.getValue(MessageModelClass.class);
messageModelClass.setmKey(dataSnapshot.getKey());
messageList.add(messageModelClass);
messageAdapter = new MessageAdapter(context, messageList , userName ,confirmationDialogListener);
rvMessage.setAdapter(messageAdapter);
Log.d(TAG,"message list size onChildAdded:"+messageList.size());
// messageAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
mDatabaseReference.addChildEventListener(mChildEventListener);
}
Change your onBindViewHolder() as below. Then it will solve your issue.