0
votes

Comment charger de manière dynamique des images d'une URL dans ImageView à partir d'une vueModel à Kotlin

J'écris une application pour afficher les scores de la LNH et souhaiterions que chaque équipe de la RecyclERView ait son logo à côté de celui-ci. Il y a une URL que je puisse demander avec une pièce d'identité d'une équipe qui retournera une image Hi-Res du logo de l'équipe. J'essaie de le faire pour que je puisse charger les images dans ma viewModel et les définir dans la vue, car je fais des choses comme le nom de l'équipe, le score actuel, etc.

J'ai essayé d'utiliser Picasso pour cette , mais cela nécessite un contexte que le point de vue n'a pas et que la viewModel ne peut pas accéder directement à l'image d'image pour pouvoir le changer. Alors, comment puis-je charger les images et les exposer avec une liaison de données ou quelque chose d'autre, pour permettre à la vue de les afficher? P>

Voici ma principale pièce: P>

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="viewModel"
            type="com.example.nhlstats.ui.game.GameViewModel" />
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@+id/awayTeam"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="12dp">

            <ImageView
                android:id="@+id/awayTeamLogo"
                android:layout_height="36dp"
                android:layout_width="0dp"
                android:layout_weight="1"
                tools:src="@drawable/ic_launcher_background"/>

            <TextView
                android:id="@+id/awayTeamName"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                android:layout_gravity="center_vertical"
                android:text="@{viewModel.awayTeamName}"
                tools:text="CHI Blackhawks"/>

            <TextView
                android:id="@+id/awayScore"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_gravity="center_vertical"
                android:text="@{viewModel.awayTeamScore}"
                tools:text="0"/>
            <TextView

                android:id="@+id/gameTime"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_gravity="center_vertical"
                android:text="@{viewModel.timeRemaining}"
                tools:text="14:26 3rd"/>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/homeTeam"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            android:layout_marginBottom="24dp">

            <ImageView
                android:id="@+id/homeTeamLogo"
                android:layout_height="36dp"
                android:layout_width="0dp"
                android:layout_weight="1"
                tools:src="@drawable/ic_launcher_background"/>

            <TextView
                android:id="@+id/homeTeamName"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                android:layout_gravity="center_vertical"
                android:text="@{viewModel.homeTeamName}"
                tools:text="CAR Hurricanes"/>

            <TextView
                android:id="@+id/homeScore"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_weight="2"
                android:text="@{viewModel.homeTeamScore}"
                tools:text="4"/>
        </LinearLayout>
    </LinearLayout>
</layout>


4 commentaires

Vous pouvez créer une variable LiveData pour l'URL dans ViewModel et l'observer dans l'élément


hey @ cpgreen2 Fabrication de demandes de réseau à Vewmodel n'est pas bonne pratique, crée une classe de référentiel pour faire le travail Suivez Guide


@Duy Khan Nguyen Comment observerait l'URL d'obtenir l'image à apparaître dans l'imageView?


Vous pouvez vérifier ma réponse ci-dessous


3 Réponses :


0
votes

I Guest Vous créerez GameviewModel Code> Pour chaque élémentView, alors lors de la liaison du titulaire de la vue:

Votre GameviewModel Code> Classe P>

viewModel.awayLogoUrl.observe(this, Observer { 
    it?.let { url ->
        //Show image into itemView using Picasso or Glide
        Glide.with(itemView.context).load(url).into(binding.awayTeamLogo)
    }
})

viewModel.homeLogoUrl.observe(this, Observer { 
    it?.let { url ->
        //Show image into itemView using Picasso or Glide
        Glide.with(itemView.context).load(url).into(binding.homeTeamLogo)
    }
})


2 commentaires

Merci pour l'exemple, c'est utile. Cela fonctionnerait bien si j'avais une vision image unique, mais comme je l'ai mentionné, j'essaie de le faire pour un recyclerview. Chaque élément de rangée a deux images (différentes) et il y a une quantité indéterminée de lignes. Comment pourrais-je définir les différentes images pour chaque ligne en utilisant quelque chose comme ça?


Pouvez-vous ajouter la classe d'adaptateur à votre message. Il est plus facile de vous montrer où se montrer les codes.



1
votes

Pour les composants d'architecture Android Voir le modèle,

Ce n'est pas une bonne pratique de transmettre votre contexte d'activité à la vue de l'activité comme une fuite de mémoire. Je ne supporte pas à cela. P>

Vous pouvez créer un observateur d'URL de l'image dans la viewModel et l'observer dans votre classe d'affichage (activité ou fragment), comme celui-ci (comme Duy Khanh Nguyen em> répondit): - P> xxx pré>

mais si vous voulez aller avec sinon, vous pouvez simplement utiliser un contexte d'application fort> fourni par le AndroidViewModel code>, vous devez prolonger AndroidViewModel Code> Ce qui est simplement un ViewModel code> qui inclut une référence application code>. Je suis votre cas dans votre baseviewmodel code>. Exemple: - P>

class BaseViewModel(application: Application) : AndroidViewModel(application) {

val context = getApplication<Application>().applicationContext

//... ViewModel methods 

}


0 commentaires

1
votes

Utilisation de la liaison de données Vous devez créer un adaptateur de liaison personnalisé comme ci-dessous:

 <androidx.appcompat.widget.AppCompatImageView
  android:layout_height="36dp"
  android:layout_width="0dp"
  android:layout_weight="1"
  app:imageUri="@{viewmodel.teamLogoUri}"/>


0 commentaires