Адаптер Firestore Recycler - изображения из пожарного магазина - PullRequest
0 голосов
/ 24 июня 2019

У меня есть настройки просмотра моего приложения чата.Я хотел бы добавить его, чтобы пользователи могли отправлять фотографии в чат.Я добавил вид изображения и добавил код для загрузки изображения в firestore.Я запутался в реализации кода для его отображения в представлении рециркулятора.

Модель:

    package com.example.android.debateapp.Message;


public class Message {

    private String ChatMessage;
    private String mChatImageURL;


    public Message(){
        //Empty constructor needed
    }

    public Message(String ChatMessage, String mChatImageURL ){
        this.ChatMessage = ChatMessage;
        this.mChatImageURL = mChatImageURL;
    }

    public String getChatMessage() {
        return ChatMessage;
    }

    public String getmChatImageURL() {

        return mChatImageURL;
    }

}

MessageRecyclerAdapter:

public class MessageRecyclerAdapter extends FirestoreRecyclerAdapter<Message, MessageRecyclerAdapter.MessageHolder> {


public MessageRecyclerAdapter(@NonNull FirestoreRecyclerOptions<Message> options) {
    super(options);

}

@Override
protected void onBindViewHolder(@NonNull MessageHolder holder, int position, @NonNull Message model) {

    holder.ChatMessage.setText(model.getChatMessage());


}

@NonNull
@Override
public MessageHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_item, viewGroup, false);

    return new MessageHolder(v);
}

class MessageHolder extends RecyclerView.ViewHolder{

    TextView ChatMessage;
    CircleImageView MessageProfilePicture;
    ImageView ChatMessageImage;



    public MessageHolder(@NonNull View itemView) {
        super(itemView);

        ChatMessage = itemView.findViewById(R.id.Message_Chat_Content);
        MessageProfilePicture = itemView.findViewById(R.id.Chat_Profile_picture);
        ChatMessageImage = itemView.findViewById(R.id.chat_Message_image);

    }

    public void setChatImage(final String downloadUri) {

        ChatMessageImage = itemView.findViewById(R.id.chat_Message_image);
        Glide.with(itemView.getContext()).load(downloadUri).into(ChatMessageImage);

        }
    }
}

ChatActivity

public class ChatActivity extends AppCompatActivity {

public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000;
private static final int GALLERY_PICK = 1;

private ListView mMessageListView;
private ImageButton mPhotoPickerButton;
private EditText mMessageEditText;
private Button mSendButton;
private String mUsername;
private ChildEventListener mChildEventListner;
private ValueEventListener mValueEventListner;
private FirebaseUser mCurrentUser;

private StorageReference storageReference;

private StorageReference mChatPhotosStorageReference;
private Context mContext;

private MessageRecyclerAdapter adapter;

private ImageView chatimage;

private String TESTmessagedoc;

private ImageView chatProfile;


//FIRE STORE
private DocumentReference mMessageDoc;
private FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
private CollectionReference collectionReference = (firebaseFirestore).collection("Messages");
private CollectionReference colRef;

private static final String TAG = ChatActivity.class.getName();


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

    storageReference = FirebaseStorage.getInstance().getReference();

    chatProfile = findViewById(R.id.Chat_Profile_picture);

    //chatimage = findViewById(R.id.photoImageView);

    final String messageDoc = getIntent().getStringExtra("Message_ID");

    TESTmessagedoc = messageDoc;

    mMessageDoc = firebaseFirestore.collection("Messages").document(messageDoc);


    colRef = firebaseFirestore.collection("Messages").document(messageDoc).collection("chats");

    mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton);
    mMessageEditText = (EditText) findViewById(R.id.messageEditText);
    mSendButton = (Button) findViewById(R.id.sendButton);

    mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
    final String current_uid = mCurrentUser.getUid();

    // ImagePickerButton shows an image picker to upload a image for a message
    mPhotoPickerButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent galleryIntent = new Intent();
            galleryIntent.setType("image/*");
            galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

            startActivityForResult(Intent.createChooser(galleryIntent, "Select Image"), GALLERY_PICK);
        }
    });


    setUpRecyclerView();

    // Enable Send button when there's text to send
    mMessageEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if (charSequence.toString().trim().length() > 0) {
                mSendButton.setEnabled(true);
            } else {
                mSendButton.setEnabled(false);
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {
        }
    });
    mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(DEFAULT_MSG_LENGTH_LIMIT)});

    mSendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String MessageText = mMessageEditText.getText().toString();


            Map<String, Object> chatMap = new HashMap<>();
            chatMap.put("ChatMessage", MessageText);
            chatMap.put("User ID", current_uid);
            chatMap.put("Timestamp", FieldValue.serverTimestamp());

            firebaseFirestore.collection("Messages")
                    .document(messageDoc).collection("chats")
                    .add(chatMap)
                    .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                        @Override
                        public void onSuccess(DocumentReference documentReference) {

                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {

                        }
                    });


            // Clear input box
            mMessageEditText.setText("");
        }
    });

}

private void setUpRecyclerView() {
    Query query = colRef.orderBy("Timestamp", Query.Direction.ASCENDING);

    FirestoreRecyclerOptions<Message> options = new FirestoreRecyclerOptions.Builder<Message>()
            .setQuery(query, Message.class)
            .build();

    adapter = new MessageRecyclerAdapter(options);

    RecyclerView recyclerView = findViewById(R.id.recycler_message_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);

}

@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == GALLERY_PICK && resultCode == RESULT_OK) {

        String imageUri = data.getDataString();

        CropImage.activity(Uri.parse(imageUri))
                .setAspectRatio(1, 1)
                .start(this);

    }

    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);
        if (resultCode == RESULT_OK) {


            Uri resultUri = result.getUri();

            final String current_user_id = mCurrentUser.getUid();
            final String randomName = UUID.randomUUID().toString();


            final StorageReference filepath = storageReference.child("chat_photos").child(randomName + ".JPG");
            filepath.putFile(resultUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {

                            final String downloadUrl = uri.toString();

                            Map<String, String> newImageUrl = new HashMap<>();
                            newImageUrl.put("image", downloadUrl);


                            firebaseFirestore.collection("Messages").document(TESTmessagedoc).collection("chats")
                                    .add(newImageUrl)
                                    .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                                        @Override
                                        public void onSuccess(DocumentReference documentReference) {

                                            /*
                                            filepath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                                @Override
                                                public void onSuccess(Uri uri) {

                                                    //The download url
                                                    final String downloadUrl =
                                                            uri.toString();
                                                    Log.d("tag", downloadUrl);
                                                    if (!downloadUrl.equals("default")) {
                                                        // I changed this to glide since i thought picasso was the problem.
                                                        // Picasso still should work. Glide is recommended by google tho
                                                        Glide.with(getApplicationContext()).load(downloadUrl).into(chatProfile);
                                                    }

                                                }
                                            });
                                            */

                                        }
                                    }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Toast.makeText(getApplicationContext(), "There was some error in saving Changes.", Toast.LENGTH_LONG).show();
                                }

                            });
                        }
                    });



                }
            });
        }
    }

}}

В классе модели я добавил getmChatImageURL

В MessageRecyclerAddapter я добавил setChatImage

, где я застрял (я думаю), находится в моем MessageRecyclerAdapter на моем onBindViewHolder Мне нужно установить его, но я не уверен, как это сделать, потому что я не знаю, как бы загрузить его в Drawable

Обновление:

В моемMessageRecyclerAdapter Я добавил это

    @Override
protected void onBindViewHolder(@NonNull MessageHolder holder, int position, @NonNull Message model) {

    holder.ChatMessage.setText(model.getChatMessage());

    holder.setChatImage(model.getmChatImageURL());

}

приложение запускается, но когда я иду, чтобы загрузить изображение в Firestore и приложение пытается отобразить его, я получаю это в журнале

W/Glide: Load failed for null with size [0x0] class com.bumptech.glide.load.engine.GlideException: Received null model

изображение хранится в firestore как URL, поэтому я считаю, что ошибка связана с настройкой адаптера, хотя я не уверен.

Update 2

Я думаю, что я на правильном пути

Я изменил свой класс адаптера

MessageRecyclerAdapter:

public class MessageRecyclerAdapter extends FirestoreRecyclerAdapter<Message, MessageRecyclerAdapter.MessageHolder> {

private Context mcontext;



public MessageRecyclerAdapter(@NonNull FirestoreRecyclerOptions<Message> options ) {

    super(options);


}

@Override
protected void onBindViewHolder(@NonNull MessageHolder holder, int position, @NonNull Message model) {

    holder.ChatMessage.setText(model.getChatMessage());


    Glide.with(mcontext.getApplicationContext())
            .load(model.getmChatImageURL())
            .into(holder.ChatMessageImage);


}

@NonNull
@Override
public MessageHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.message_item, viewGroup, false);

    return new MessageHolder(v);
}

class MessageHolder extends RecyclerView.ViewHolder{

    TextView ChatMessage;
    CircleImageView MessageProfilePicture;
    ImageView ChatMessageImage;



    public MessageHolder(@NonNull View itemView) {
        super(itemView);

        ChatMessage = itemView.findViewById(R.id.Message_Chat_Content);
        MessageProfilePicture = itemView.findViewById(R.id.Chat_Profile_picture);
        ChatMessageImage = itemView.findViewById(R.id.chat_Message_image);

    }


}

}

Я добавил образ набора скольжения в onbind. Ошибка, с которой я сталкиваюсь сейчас, когда запускаю код,

android.content.Context android.content.Context.getApplicationContext()' on a null object reference

Я также пытался

Glide.with(holder.ChatMessageImage.getContext())
            .load(model.getmChatImageURL())
            .into(holder.ChatMessageImage);

приложение запускается, я могу успешно загрузить изображение в firestore, но затем вылетает

W/Glide: Load failed for null with size [0x0]
class com.bumptech.glide.load.engine.GlideException: Received null model

Я не уверен, как отладить это, потому что когда я подключаю отладчик ккод скольжения в onbind запускается, как только запускается активность

1 Ответ

0 голосов
/ 25 июня 2019

Если вы уже знаете imageUrl, просто передайте его так:

@Override
protected void onBindViewHolder(@NonNull MessageHolder holder, int position, @NonNull Message model) {

    holder.ChatMessage.setText(model.getChatMessage());
    holder.setChatImage(imageUrl)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...