Affichage d'une image stockée dans le folder drawable

Résolu/Fermé
Elona - Modifié le 18 févr. 2021 à 17:32
 Elona - 18 févr. 2021 à 17:46
Bonjour,


J'ai créé une classe "Room" qui gère une liste de salle de réunion :
package com.example.mareu.Model;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Room {

    private long mId;
    private String mRoomName;
    private long mSeats;
    private String mImage;
    private static final List<Room> DUMMY_ROOMS = Arrays.asList(
            new Room( 1, "Etretat", 3 , "etretat.jpg"),
            new Room( 2, "Himalaya", 10, "himalaya.jpg" ),
            new Room( 3, "Laponie", 5, "laponie.jpg" ),
            new Room( 4, "Guadeloupe", 7, "guadeloupe.jpg" ),
            new Room( 5, "Etats Unis", 2, "canyon.jpg" ),
            new Room( 6, "Madagascar", 5,"madagascar.jpg" ),
            new Room( 7, "Rome", 20, "rome.jpg" ),
            new Room( 8, "Tahiti", 10, "tahiti.jpg" ),
            new Room( 9, "Thaïlande", 5, "thaïlande.jpg" ),
            new Room( 10, "Vietnam", 5, "vietnam.jpg"),
            new Room( 11, "Russie", 5, "kremlin.jpg")
    );

    public static List<Room> generateRooms(){
        return DUMMY_ROOMS;
    }

    public Room(long id, String mName, long seats, String image) {
        mId = id;
        mRoomName = mName;
        mSeats = seats;
        mImage = image;
    }


    public long getId(){
        return mId;
    }

    public String getRoomName(){
        return mRoomName;
    }

    public String getRoomImage(){
        return mImage;
    }

}

et une classe adapter :
package com.example.mareu.Activity;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.mareu.R;
import com.example.mareu.Model.Meeting;
import com.example.mareu.Model.Room;

import com.example.mareu.Service.MeetingApiService;

import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
* {@link RecyclerView.Adapter} that can display a {@link Meeting}.
 */
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private static final String TEXT_SEPARATOR = " - ";
    private List<Meeting> mMeetings;
    private MeetingApiService apiService;
    private Context context; 

   @NonNull
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            context = parent.getContext();
            View view = LayoutInflater.from( parent.getContext() ) 
               .inflate( R.layout.fragment_item_list, parent, false );
        return new MyViewHolder( view );
    } 

   @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) { 
       // First line of the meeting : Subject - StartDate - Room
        String subjectMeeting = mMeetings.get( position ).getMeetingSubject();
        Date mDateDebut = mMeetings.get( position ).getMeetingDateDebut();
        DateFormat shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,                DateFormat.MEDIUM, new Locale("FR","fr"));
        long mId = mMeetings.get(position).getIdRoom();
        List<Room> lRoomMeeting = Room.generateRooms(); 
       String mRoomName = lRoomMeeting.get( (int) mId ).getRoomName();
        String mRoomImage = lRoomMeeting.get( (int) mId ).getRoomImage();
        System.out.println(mRoomImage);
//        Context context = ;
        int id = context.getResources().getIdentifier("drawable/" + mRoomImage, null, null);
        holder.mMeetingRoomImage.setImageResource( id); 

       // TextHolder for the first line
       String mFirstLineString = subjectMeeting + TEXT_SEPARATOR + shortDateFormat.format( mDateDebut ) + TEXT_SEPARATOR + mRoomName ;
        holder.mFirstLine.setText( mFirstLineString ); 

       // TextHolder for the second line 
       String mGuestList = mMeetings.get(position).getMeetingGuestList();
        holder.mSecondLine.setText( mGuestList);

        // Delete button
        deleteButton( holder, position ); 
   } 

   public void setData(List<Meeting> meetings) {
        this.mMeetings = meetings; 
       notifyDataSetChanged(); // dit à l'adapter de se rafraichir
    }

    private void deleteButton(@NonNull MyViewHolder holder, final int position) {  
      holder.mButtonDeleteMeeting.setOnClickListener( view -> {  
          Toast.makeText( view.getContext(), "Suppression de la réunion " + mMeetings.get( position ).getMeetingSubject(), Toast.LENGTH_SHORT ).show();
            deleteItem( position );
            setData( mMeetings ); 
       } ); 
   } 

   private void deleteItem(int position) { 
       apiService.deleteMeeting( mMeetings.get( position ) ); 
   } 

   @Override
    public int getItemCount(){
        return mMeetings.size();
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView mMeetingRoomImage; 
       TextView mFirstLine;
        TextView mSecondLine;
        ImageButton mButtonDeleteMeeting;

        MyViewHolder(@NonNull View itemView) {
            super( itemView );
            mMeetingRoomImage = itemView.findViewById( R.id.item_image_meeting );
            mFirstLine = itemView.findViewById( R.id.item_meeting_first_line );
           mSecondLine = itemView.findViewById( R.id.item_meeting_second_line );
            mButtonDeleteMeeting = itemView.findViewById( R.id.item_image_meeting_delete );
        }
    }}


Le soucis est que je n'arrive pas à afficher l'image correspondant à la salle de réunion.
Quelqu'un peut il m'aider ?


Configuration: Windows / Chrome 88.0.4324.150
A voir également:

2 réponses

BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
18 févr. 2021 à 17:37
Bonjour,

Pour accéder aux ressources dans le dossier Drawable, rien de plus simple
holder.mMeetingRoomImage.setImageResource(R.drawable.room);

Par contre, tu ne peux pas "construire l'id" de manière dynamique, étant donné que l'ID est généré à la création de l'app

Note : je me suis permis de reformatter ton code avec des balises plus adéquates
1
Hello
J'ai finalement réussi.
String mRoomImage = lRoomMeeting.get( mId-1 ).getRoomImage();

Integer keyImg= context.getResources().getIdentifier(mRoomImage, "drawable", context.getPackageName());
holder.mMeetingRoomImage.setImageResource( keyImg);

Tu peux rendre l'affichage dynamique en allant récupérer l'identifiant de l'image juste avant le holder......

Merci pour ton aide
0