2017-10-04 1 views
1

Comment modifier une vue spécifique en ligne dans RecyclerView. Adapter.notifyDataSetChanged ou Adapter.notifyItemChanged mise à jour rangée. Mais j'ai besoin de changer la vue spécifique en ligne, sans toucher aux autres vues de cette rangée.Modification de l'élément spécifique en ligne dans la vue Recycleur

+1

Voir les moyens? Désolé je ddnt obtenir la question, allez-vous changer l'étiquette de la ligne, la couleur des boutons ou le style de rangée entière ..? ou voulez-vous changer la vue entière de rangée en un autre xml de disposition? –

+0

Bonjour Vishnu KR! J'ai deux imagesView et deux textViews. Chaque fois que l'utilisateur clique sur la ligne, je veux que l'un de ces textesVIews dans chaque ligne change de texte. Mais le problème est qu'une autre imageView obtient sa source via la bibliothèque Picasso. Et chaque fois que je change les textes via notifyDataSetChanged ou etc. Picasso met à jour l'imageView, et il est visible à l'utilisateur. Je veux éviter que cela se produise, donc la question est: comment puis-je changer la vue spécifique de la ligne, sans toucher la ligne entière –

+0

Haah .. vous dites que Picasso recharger l'image à ce moment-là. Donc, je pense que vous devez utiliser la technique de mise en cache d'image. Le Picasso ne chargera donc plus l'image si elle est déjà chargée. Ou l'option suivante est de bloquer par show et de cacher l'image en utilisant un tag à l'intérieur du modèle d'article –

Répondre

0

Tout d'abord, utilisez Glide (par Google) au lieu de Picasso. C'est plus efficace. Deuxièmement, votre appareil ne téléchargera plus la même image si elle est déjà présente dans votre mémoire cache.

Maintenant, Modifiez simplement les données dans votre liste, puis mettez à jour votre vue d'adaptateur ou de recycleur.

l'intérieur de votre AdapterClass

Créer une interface, disons que

public interface TheUpdater{ 
    public void updateMyAdapter(int position); 
} 

mettre en œuvre ensuite cette interface dans votre activité et remplacer cette méthode.

Maintenant, afin d'obtenir la position de la vue.

Vous pouvez remplacer onClick() d'une vue (bouton ou même la vue parentale, c'est-à-dire la mise en page) et exécuter l'instruction suivante.

mTappedPosition = getAdapterPosition(); 

listener.updateMyAdapter(mTappedPosition); //Update the adapter 

mTappedPosition est votre variable globale.

l'intérieur de votre activité

@Override 
updateMyAdapter(int position){ 
---- //Do stuff 
mAdapter.notifyItemSetChanged(position); 
} 
+0

Je sais, mais le problème est que j'ai ImageView qui source de téléchargement via Picasso, et chaque fois que je configure notifyDatasetChanged Picasso téléchargement l'image, et cette mise à jour visible à l'utilisateur, je veux empêcher cela –

+0

Serez-vous en mesure d'obtenir la position de la vue à l'intérieur de l'adaptateur? Si oui, j'ai une solution pour cela. – Dennis

+0

Oui, je peux obtenir la position quand je fais les changements –

0

vous pouvez utiliser le code suivant

MyRecyclerAdapter.ViewHolder viewHolder= (MyRecyclerAdapter.ViewHolder) recycleView.findViewHolderForAdapterPosition(1); 
    viewHolder.txtView.SetText("Some Text"); 
+0

Comme je l'ai déjà mentionné, il ne aide pas –

+0

pls essayer le code mis à jour – Manish

+0

D'accord, juste un instant –

0

Je pense que pour éviter le problème de chargement d'image, vous devez utiliser la technique de la mise en cache d'image. Donc, cette image déjà chargée ne sera plus chargée.

ou

Si l'image est déjà chargée et chaque rangée est montrant même image défini, vous pouvez alors garder un drapeau booléen à votre itemModel (DTO qui a les données de l'élément adaptateur). et changez ce modèle, puis appelez

yourListToAdapter(index).setFlag(showImage1); // showImage1 boolean flag 

yourAdapter.notifyItemChanged(index);