2016-09-14 9 views
10

में फायरबेस भंडारण छवियों को प्रदर्शित करना हाय मैंने अपने फायरबेस डेटाबेस से बेस 64 का उपयोग करके एक छवि प्रदर्शित करने के बारे में पहले के प्रश्न पूछा। फायरबेस भंडारण का उपयोग करने की सिफारिश की गई थी। मैंने अपना कोड दोबारा बनाया और सबकुछ फायरबेस स्टोरेज और डाटाबेस में लोड हो गया जैसा इसे करना चाहिए। मेरे पास यह मुद्दा है जब मैं डेटा को सहेजता हूं, मेरे रीसाइक्लर्व में कुछ भी नहीं आता है। सब कुछ खाली है।रीसाइक्लिंग व्यू

कोई भी मदद जो आप मुझे काम पर लाने के लिए प्रदान कर सकते हैं वह बहुत अच्छा होगा। धन्यवाद।

संपादित करें: मेरी गतिविधि कक्षा में मैं कैमरा सक्रिय करने के लिए बटन क्लिकलिस्टर को कॉल कर रहा हूं। एक बार तस्वीर लेने के बाद इसे फायरबेस स्टोरेज में सहेजा जाता है। फिर मैं इसे स्टोरेज से छवि डाउनलोड करता हूं और इसे रीसाइक्लर्व में प्रदर्शित करता हूं। मैं अपलोडिंग हिस्से को समझता हूं लेकिन मुझे डाउनलोड करने और प्रदर्शित करने वाले हिस्से को समझने में कठिनाई हो रही है। धन्यवाद।

viewholder: बाँध विधि

public void bind (ImageProgress progress){ 

    Glide.with(activity).load("").into(image); 
} 
} 

एडाप्टर

@Override 
public ProgressViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    return new ProgressViewHolder(activity, activity.getLayoutInflater().inflate(R.layout.weight_progress_list, parent, false)); 

मुख्य गतिविधि वर्ग

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.weight_progress); 

    saveButton = (Button) findViewById(R.id.saveButton); 
    progressStatusEditText = (EditText) findViewById(R.id.progressStatusEditText); 
    progressList = (RecyclerView) findViewById(R.id.progressList); 
    mImageButton = (ImageButton) findViewById(R.id.takePictureButton); 
    capturedImage=(ImageView)findViewById(R.id.capturedImageView); 

    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    progressList.setHasFixedSize(false); 
    progressList.setLayoutManager(layoutManager); 

    //take picture button 
    mImageButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      openCamera(); 
     } 
    }); 


    mDatabaseReference = database.getReference("Progress"); 

    saveButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //get current user 
      FirebaseUser user =FirebaseAuth.getInstance().getCurrentUser(); 
      String uid = user.getUid(); 
      ImageProgress progress = new ImageProgress(uid, progressStatusEditText.getText().toString()); 
      mDatabaseReference.push().setValue(progress); 
      progressStatusEditText.setText(""); 
     } 
    }); 
} 

private void openCamera() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 

     Uri cameraImageURI = data.getData(); 
     //reference where images will be stored 
     mStorageReference = storage.getReference("Progress Images"); 
     //reference to store file 
     final StorageReference cameraImageRef = mStorageReference.child(cameraImageURI.getLastPathSegment()); 
     //upload to firebase storage 
     cameraImageRef.putFile(cameraImageURI) 
       .addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { 
        @Override 
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
         Uri downloadUrl = taskSnapshot.getDownloadUrl(); 
         progressStatusEditText.setText(downloadUrl.toString()); 
        } 
       }); 
} 
+0

अच्छा सुनें कि आपने फायरबेस स्टोरेज का उपयोग करने के लिए स्विच किया है। यह बहुत बेहतर पैमाने पर होना चाहिए। लेकिन हमारे लिए जल्दी से मदद करने के लिए यहां बहुत अधिक कोड है। आप छवियों को अपलोड करने, बटन क्लिक को संभालने, डेटाबेस से पढ़ने और बहुत कुछ प्रतीत होते हैं। इसे कम करें [समस्या को पुन: उत्पन्न करने के लिए आवश्यक न्यूनतम कोड] (http://stackoverflow.com/help/mcve) और हमारे पास आपकी सहायता करने में सक्षम होने का एक बेहतर मौका होगा। –

+0

@ फ्रैंकवन पफेलन हाय फ्रैंक, मैंने आशा व्यक्त की है कि मेरी समस्या कहां है। मैंने अपनी समस्या के बारे में और विवरण जोड़ा है। मदद के लिए आपका अग्रिम धन्यवाद। – hozdaman

+0

@ फ्रैंकवन पफेलन हाय, मैं सोच रहा था कि क्या आपको मेरे संपादित कोड को देखने का मौका मिला है? धन्यवाद। – hozdaman

उत्तर

4

मैं तुम्हें यो अपने RecyclerView.ViewHolder पर setImage विधि जोड़ने .और का यूआरएल स्टोर सलाह है कि आपके उस ऑब्जेक्ट में छवि जिसे आप अपने FirebaseRecyclerAdapter में पुनर्प्राप्त करते हैं।

मेरे ViewHolder उदाहरण::

मेरे मामले में, मैं एक Glide मेरे ऐप की छवियों का प्रबंधन करने का उपयोग कर

private FirebaseRecyclerAdapter<Person, UserListViewHolder> getFirebaseRecyclerAdapter(Query query) { 
    return new FirebaseRecyclerAdapter<Person, UserListViewHolder>(
      Person.class, R.layout.user_row_item, UserListViewHolder.class, query) { 

     @Override 
     protected void populateViewHolder(UserListViewHolder viewHolder, Person model, int position) { 
      setupUser(viewHolder, model, position, null); 
     } 

    }; 
} 

private void setupUser(final UserListViewHolder UserViewHolder, final Person user, final int position, final String inPostKey) { 
    final String postKey; 
    if (mAdapter instanceof FirebaseRecyclerAdapter) { 
     postKey = ((FirebaseRecyclerAdapter) mAdapter).getRef(position).getKey(); 
    } else { 
     postKey = inPostKey; 
    } 
    FirebaseUtil.getUsersRef().child(postKey).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(final DataSnapshot dataSnapshot) { 
      UserViewHolder.setPostClickListener(new UserListViewHolder.UserClickListener() { 
       @Override 
       public void onUserClick() { 
        mGroup.addUserToGroup(dataSnapshot.getKey()); 
       } 
      }); 
      UserViewHolder.setIcon(dataSnapshot.child("photoUrl").getValue(String.class)); 
      UserViewHolder.setText(dataSnapshot.child("displayName").getValue(String.class)); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

:

public class UserListViewHolder extends RecyclerView.ViewHolder { 
private final View mView; 
private static final int POST_TEXT_MAX_LINES = 6; 
private ImageView mIconView; 
private TextView mAuthorView; 
private UserClickListener mListener; 

public UserListViewHolder(View itemView) { 
    super(itemView); 
    mView = itemView; 
    mIconView = (ImageView) mView.findViewById(R.id.user_image_profile); 
    mAuthorView = (TextView) mView.findViewById(R.id.user_text_profile); 
    mView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mListener.onUserClick(); 
     } 
    }); 
} 

public void setIcon(String url) { 
    GlideUtil.loadProfileIcon(url, mIconView);//  
} 

public void setPostClickListener(UserClickListener listener) { 
    mListener = listener; 
} 


public void setText(final String text) { 
    if (text == null || text.isEmpty()) { 
     mAuthorView.setVisibility(View.GONE); 
     return; 
    } else { 
     mAuthorView.setVisibility(View.VISIBLE); 
     mAuthorView.setText(text); 
     mAuthorView.setMaxLines(POST_TEXT_MAX_LINES); 
    } 
} 

public interface UserClickListener { 
    void onUserClick(); 
} 
} 

और यहाँ मेरी डेटाबेस कॉल है आपको केवल उसी छवि को सेट करने की आवश्यकता है जिस तरह से आप फायरबेस से डेटा पुनर्प्राप्त करते समय अपने अन्य मूल्य निर्धारित करते हैं, लेकिन आपके पहले से जेनरेट किए गए newURL का उपयोग कर रहे हैं क्लाउड पर अपलोड करने के बाद वह छवि। हो सकता है कि आप केवल यूआरएल सेट करने के लिए एक और तरीका ढूंढ सकें, लेकिन मेरा सुझाव है कि आप इसे अपने कस्टम ऑब्जेक्ट में एक और पैरामीटर की तरह रखें, अगर आप उस डेटा को अपलोड नहीं कर रहे हैं, तो भी आप डेटा को एक से अधिक बार पुनर्प्राप्त करना चाहते हैं, तो डायनेमिक होने के नाते।

आशा है कि इससे आपकी मदद मिलेगी!

+0

डर्डिन क्या आप मेरी मदद कर सकते हैं, जब मैं फायरबेस पर छवि अपलोड कर रहा हूं तो इसकी सफलतापूर्वक अपलोड की गई है और साथ ही अपलोड की गई छवि यूआई में एडाप्टर में दो बार क्यों दिखाई दे रही है? – Erum

1

इस उद्देश्य के लिए पहले से ही एक आधिकारिक कार्यान्वयन है।

https://github.com/firebase/quickstart-android/tree/master/storage

मूल विचार डेटाबेस के लिए छवि यूआरएल firebase भंडारण और दुकान पर चित्र अपलोड करें और फिर इस लिंक के माध्यम से इसे डाउनलोड करने के लिए है।

MyDownloadService.java क्लास mStorageRef.child (downloadPath) में .getStream विधि का उपयोग किया गया था, लेकिन मैंने इनपुटस्ट्रीम से निपटने के लिए GetBytes विधि के साथ कार्यान्वित किया। क्योंकि आसानी से ग्लाइड के साथ बाइट लोड कर सकते हैं। जब कार्य पूरा हो जाता है, तो यह बंडल के रूप में बाइट्स के साथ एक प्रसारण इरादा भेजता है। जब भी डाउनलोड हो जाए तो आप अपनी छवि को लोड करने के लिए जहां भी चाहें प्रसारण रिसीवर सुन सकते हैं।

public class DownloadService extends Service{ 

    private StorageReference mStorageRef; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // Initialize Storage 
     mStorageRef = FirebaseStorage.getInstance().getReference(); 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    if (ACTION_DOWNLOAD.equals(intent.getAction())) { 


     mStorage.child(downloadPath).getBytes(10*1024*1024).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
      @Override 
      public void onSuccess(byte[] bytes) { 
       Log.d(TAG, "download:SUCCESS " + bytes.length); 

       // Send success broadcast with number of bytes downloaded 
       Intent broadcast = new Intent(ACTION_COMPLETED); 
       broadcast.putExtra(EXTRA_DOWNLOAD_BYTES, bytes); 
       broadcast.putExtra(EXTRA_DOWNLOAD_INDEX, uid); 
       LocalBroadcastManager.getInstance(getApplicationContext()) 
         .sendBroadcast(broadcast); 

       // Mark task completed 
       taskCompleted(); 
      } 
     }).addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception exception) { 
        Log.w(TAG, "download:FAILURE", exception); 

        // Send failure broadcast 
        Intent broadcast = new Intent(ACTION_ERROR); 
        broadcast.putExtra(EXTRA_DOWNLOAD_PATH, downloadPath); 
        LocalBroadcastManager.getInstance(getApplicationContext()) 
        .sendBroadcast(broadcast); 

        // Mark task completed 
        taskCompleted(); 
       } 
      }); 
    } 

    } 
0

उपयोग कस्टम सूची एडाप्टर सूचीदृश्य को संभालने के लिए और imageView उपयोग GLIDE जो भंडारण के लिंक के साथ छवियों को लोड करने के लिए सरल विधि के प्रदान करता है संभाल करने के लिए।

http://wptrafficanalyzer.in/blog/listview-with-images-and-text-using-simple-adapter-in-android/

लिंक बाहरी मेमोरी

तुम सिर्फ वांछित छवि कॉल करने की आवश्यकता के लिए firebase sorage छवि को बचाने के लिए के साथ सूची एडाप्टर और imageView और TextView

https://firebase.google.com/docs/storage/android/download-files

लिंक बनाने के लिए सूचीदृश्य में विशेष रूप से देखने के लिए

+1

इन उद्देश्यों के लिए एक सूचीदृश्य से पुनर्नवीनीकरण की सिफारिश की जाती है; वैसे भी, अगर आप कुछ जवाब देने का प्रस्ताव दे रहे हैं तो कम से कम "कैसे करें" या कुछ लिंक दें। –

+0

ठीक है अब मैंने अपना जवाब अपडेट किया है, आप इसे प्राप्त कर सकते हैं। – pratikpchpr

संबंधित मुद्दे