2016-12-28 46 views
0

代碼使用火力地堡上傳圖像:使用Firebase Android上傳圖片需要很長時間才能上傳?

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:"); 
       } 
      }); 
     } 

在發送每當我發送其在我的再循環器顯示如果兩次3個圖像是在待決的任何文本和我發送一些文本,然後被顯示的文本消息的過程在回收站查看三次,而在Firebase控制檯中只顯示一次數據。 當我再次重新啓動應用程序,然後顯示確切的消息。 多次顯示文字或圖片的原因是什麼?

Recyclercode:),如下

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); 
    } 
+0

請上傳您的回收代碼 –

+0

@SagarPatil請校驗碼 – Erum

+0

變化'messageAdapter.notifyDataSetChanged();''來mesageadapter。 notifyItemInserted()' –

回答

0

更改您的onBindViewHolder(:對於chileEventListener

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

代碼。然後它會解決你的問題。

@Override 
public void onBindViewHolder(final MessageAdapter.MyViewHolder holder, final int position) { 
    final MessageModelClass messageModelClass = messageModelList.get(position); 
    if(messageModelClass !=null) 
    { 
    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()); 
       } 
    } 
    else 
    { 
    //set all your holer element to visibility gone 
    //eg. holder.tvUserName.setVisibility(View.GONE); 
    } 

} 
+0

我做到了這一點,但仍然沒有影響仍然在上傳圖片時,他們在回收站視圖中顯示兩次 – Erum

+0

在將其傳遞給回收站視圖之前,請先檢查您的數組列表。或卸載應用程序,並再次檢查它 –

+0

可以幫助我是當我上傳圖像我的聽衆被調用兩次。 mChildEventListener = new ChildEventListener(){ @Override public void onChildAdded(DataSnapshot dataSnapshot,String s){ – Erum

0

chenge你這樣的代碼。因爲你設置你需要notifyItemInserted之前唯一沒有設置adpter再次適配器..

@Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      MessageModelClass messageModelClass = dataSnapshot.getValue(MessageModelClass.class); 
      messageModelClass.setmKey(dataSnapshot.getKey()); 
      messageList.add(messageModelClass); 

      messageAdapter.notifyItemInserted(messageList.size()-1); 
     } 
+0

@Abhidshek Singh哪個位置需要通過messageAdapter.notifyItemInserted(int position); – Erum

+0

@Erum只是修改你的onChild方法相同,我的代碼 –

+0

它要求在這個方法中的位置notifyItemInserted我使用recyclerview? – Erum

相關問題