J'essaye d'implémenter une application de type IM, mais je suis coincé sur un problème qui m'ennuie vraiment.CardAdapter saute automatiquement quand une demande est envoyée pour charger l'image
J'utilise recyclerview
pour afficher les messages de manière défilante, afin que les utilisateurs puissent faire défiler les vues pour voir tous les messages. La présentation de base des messages est un widget cardview
.
En outre, j'ai utilisé une autre disposition dans la disposition des messages qui est également cardview
pour afficher les sous-messages.
Pour être plus détaillé, j'aimerais visualiser les dispositions que j'ai utilisées. Regardez l'image suivante:
Comme vous le voyez, j'utilise deux cardviews imbriqués (dans l'autre). De plus, comme j'utilise recyclerview
pour les sous-messages, j'ai un comportement de défilement. Lorsque je fais défiler des sous-messages, la méthode onBindViewHolder de recyclerview est appelée. Pour récupérer chaque image, j'appelle une API dans la méthode onBindViewHolder.
Maintenant, le problème se pose lorsque je veux faire défiler les sous-messages. Il semble que lorsque l'API est appelée quelque chose ne va pas. Bien que l'image soit récupérée avec succès à partir de l'API, elle saute vers le bas et vers le haut de l'écran.
Par exemple, si je fais défiler les sous-messages du dernier message vers la droite. Il se termine par le résultat suivant:
Ceci est la méthode onBindViewHolder()
des sous-messages adaptés, pour travailler avec les images, j'utilise la bibliothèque Android Glide:
public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
.
.
.
public void onBindViewHolder(ViewHolder holder, int position) {
SubMessage subMessage = subMessageList.get(position);
final long mediaFileId = subMessage.getMediaFileId();
holder.ivSubmessageImage.setImageDrawable(null);
if (mediaFileId != 0) {
holder.ivSubmessageImage.setImageResource(R.mipmap.ic_launcher);
holder.ivSubmessageImage.setMinimumHeight(100);
holder.ivSubmessageImage.setMinimumWidth(200);
Glide.with(context).load(Config.FILE_SERVER_URL+"api/file/" + mediaFileId + "/thumb")
.into(holder.ivSubmessageImage);
holder.ivSubmessageImage.setVisibility(View.VISIBLE);
} else {
holder.ivSubmessageImage.setImageBitmap(null);
holder.ivSubmessageImage.setVisibility(View.INVISIBLE);
}
...
}
.
.
.
}
Ce sont les mises en page que j'ai créé (pour le moment):
channel_log_list.xml(msgCardview)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
app:cardCornerRadius="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/MyCardViewStyle"
android:layout_marginTop="3dp"
android:padding="2dp"
android:layout_marginBottom="1dp"
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"
android:layout_marginRight="23dp"
app:cardPreventCornerOverlap="false"
android:layout_marginLeft="23dp"
app:cardBackgroundColor="@color/chatMsgBg"
android:id="@+id/channelLogCard"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/ivMessageImage"/>
<com.example.TextViewPlus
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="messages"
app:customFont="@string/irs"
android:id="@+id/channelLogAppletTitle"
android:textSize="@dimen/content_text_size_small2"
android:layout_marginBottom="10dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/lstSubMessages"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
sub_message_list_item.xml(subMsgCardview)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="200dp"
app:cardCornerRadius="3dp"
android:layout_height="300dp"
style="@style/SubMessageCardViewStyle"
android:id="@+id/SubMessageCard">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layoutDirection="rtl">
<ImageView
android:layout_width="match_parent"
android:layout_height="110dp"
android:id="@+id/ivSubMessageImage"
android:visibility="invisible"/>
<com.example.TextViewPlus
android:padding="5dp"
android:layout_marginTop="10dp"
android:id="@+id/tvText"
app:customFont="@string/irs"
android:textSize="@dimen/content_text_size_small1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</android.support.v7.widget.CardView>
android:focusableInTouchMode="true" or make that layout which you want to focus
Je vais avoir cette question. Avez-vous trouvé une solution pour cela? – dazza5000Oui! J'ai utilisé la bibliothèque Fresco à la place des éléments natifs d'Android. Je vous recommande également d'utiliser comme il fournit des options intéressantes pour travailler avec des images :) il vaut vraiment la peine @ dazza5000 –
J'utilise Glide si ... – dazza5000