IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

ListView passé une ligne sélectionné à une autre


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Par défaut ListView passé une ligne sélectionné à une autre
    Bonjour,

    Dans mon projet lorsque je clique sur une ligne elle doit apparaitre sélectionné, jusque là c'est bon ensuite j'ai bouton que nous nommerons bouton suivant qui doit me faire passé une ligne sélectionné de la ligne 1 à la ligne 2. Jusque là c'est bon cependant si j'ai une listview de 50 ligne mon écran affiche les 10 première.

    Quand je suis sur la ligne 10 et que j'appuie sur le bouton suivant je souhaite sélectionné le 11 ém item.

    J'arrive à faire scrollé ma liste view pour que le 11ém soit afficher mais je n'arrive pas à récupéré Ma view Child de ma liste view étant donné que mes position ce sont modifié en scrollant. Donc auriez-vous une solution ?
    code de mon bouton suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    bt_suivant_sound.setOnClickListener(new OnClickListener() {
     
    			@Override
    			public void onClick(View v) {
     
    				if((position_sound_selected  + 1) != (listSound.size() + 1))
    				{
    					player.start_sound(listSound.get(position_sound_selected).getPath());
     
    					View child = liste_sound.getChildAt(position_sound_selected);
    					child.setSelected(false);
     
    					position_sound_selected = position_sound_selected + 1;
     
    // je fait scrollé ma list view à la position qui m'intérrésse					liste_sound.smoothScrollToPosition(position_sound_selected);
     
    					// Et ici mon getChildAt et faussé :/
    					child = liste_sound.getChildAt(position_sound_selected);
     
    					child.setSelected(true);
    				}
     
    			}
    		});
    Pour réglé ce soucis.

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Bonjour nico_nico95,

    Je ne pense pas que les indexes changent du fait du scroll de la ListView.
    Si c'est le scroll qui pose problème, il suffit peut-être de le faire après avoir sélectionné le nouvelle item?

    Il me semble que la ListView interdit la sélection d'item lorsqu'elle passe en TouchMode, et je pense que le fait de lancer un scroll déclenche cet état. C'est pour cela, à mon avis, que la sélection ne peut se faire. Donc il suffit de sélectionner d'abord, et de scroll après.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Par défaut
    On ne peut sélectionné une ligne que si celle-ci est visible à l'écran.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Autant pour moi, une réponse plus pertinente peut-être:

    public void setSelection (int position)
    Added in API level 1

    Sets the currently selected item. If in touch mode, the item will not be selected but it will still be positioned appropriately. If the specified selection position is less than 0, then the item at position 0 will be selected.
    Parameters
    position Index (starting at 0) of the data item to be selected.
    Si j'ai bien compris, cette méthode fait le scroll si nécessaire. Elle appartient à ListView.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Par défaut
    Merci pour ta réponse mais je suis sur une ListView avec un adapter celle-ci à un CheckBox puis des Textview. Donc lorsque j'effectue un Listview.setSelection( position qui m'intérré ) ma listView remonte bien quand celle-ci doit scrollé mais ma Ligne n'est pas sélectionné.

    J'ai tenté également un ListView.getPositionItemid( position ) pour récupéré le bon child mais il me retourne toujours zéro...

    code de mon bouton suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    bt_suivant_sound.setOnClickListener(new OnClickListener() {
     
    	@Override
    	public void onClick(View v) {
     
    		if((position_sound_selected  + 1) != (listSound.size() + 1))
    		{
     
    			position_sound_selected += 1;
    			liste_sound.smoothScrollToPosition(position_sound_selected);
    			ArrayList<View> viewChild = new ArrayList<View>();
     
    			View ViewDeselect = null;
    			View ViewSeselect = null;		
    			for (int i = 0; i <= liste_sound.getLastVisiblePosition() - liste_sound.getFirstVisiblePosition(); i++) 
    			{
    				if(liste_sound.getChildAt(i).isSelected())
    					{
    					ViewDeselect = liste_sound.getChildAt(i);
    							ViewSeselect = liste_sound.getChildAt(i + 1);
    							break;
    					}
    			}
     
    			if(ViewDeselect != null)
    				if(ViewDeselect.isShown())
    					ViewDeselect.setSelected(false);
     
    			if(ViewSeselect != null)
    				if(ViewSeselect.isShown())
    					ViewSeselect.setSelected(true);
     
     
     
     
    }
     
    			}
    		});
    La viewDeseclect après que ma ListView et scroll est toujours à null alors que normalement elle devrait être remplie...

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Une autre piste:

    http://developer.android.com/referen...lListener.html

    L'idée est de détecter la fin du scrolling afin de sélectionner l'item voulue. SI avec cela ça ne fonctionne pas, je crois que je n'aurais plus d'idée...

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Et voilà, je viens de trouver une méthode pour arriver à ton résultat, bon il faudrat surement adapter un peu, mais ça fonctionne:

    le layout principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
     
        <Button
            android:id="@+id/buttonPrevious"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="previous" />
     
        <Button
            android:id="@+id/buttonNext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:text="next" />
     
        <ListView
            android:id="@+id/listView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/buttonPrevious"
            android:layout_below="@+id/buttonPrevious"
            android:addStatesFromChildren="false"
            android:choiceMode="singleChoice"
            android:listSelector="@android:color/darker_gray" >
     
        </ListView>
     
    </RelativeLayout>
    l'acitivté principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    public class MainActivity extends Activity implements OnClickListener{
    	private String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
    			  "Blackberry", "WebOS", "Ubuntu","Fedora", "CentOS", "LinuxMint", "Debian",
    			  "Windows7", "Mac OS X", "Linux", "OS/2" };
     
    	private PersonnalArrayAdapter adapter;
    	private ListView listView;
    	private int currentIndexSelection = 0;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
     
    		this.adapter = new PersonnalArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, this.values);
    		this.listView = (ListView) findViewById(R.id.listView1);
    		this.listView.setAdapter(this.adapter);
    		this.listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
     
    		((Button) findViewById(R.id.buttonNext)).setOnClickListener(this);
    		((Button) findViewById(R.id.buttonPrevious)).setOnClickListener(this);
    	}
     
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
     
    	@Override
    	public void onClick(View v) {
    			switch(v.getId()){
    			case R.id.buttonNext:
    				this.currentIndexSelection++;
    				this.listView.smoothScrollToPosition(this.currentIndexSelection);
    				this.adapter.setSelectedPosition(this.currentIndexSelection);
    			break;
     
    			case R.id.buttonPrevious:
    				this.currentIndexSelection--;
    				this.listView.setSelection(this.currentIndexSelection);
    				this.listView.smoothScrollToPosition(this.currentIndexSelection);
    				this.adapter.setSelectedPosition(this.currentIndexSelection);
    			break;
    			}
    	}
     
    }
    et un adapter personnalisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    public class PersonnalArrayAdapter<T> extends ArrayAdapter<T>{
    	private int selectedIndex = -1;
    	public PersonnalArrayAdapter(Context context, int resource,
    			int textViewResourceId, T[] objects) {
    		super(context, resource, textViewResourceId, objects);
    		// TODO Auto-generated constructor stub
    	}
     
     
    	public void setSelectedPosition(int pos){
    		this.selectedIndex = pos;
    		notifyDataSetChanged();
    	}
     
     
    	public int getSelectedPosition(){
    		return this.selectedIndex;
    	}
     
    	@Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		// TODO Auto-generated method stub
    		View view = super.getView(position, convertView, parent);
     
    		if (position == this.selectedIndex)
    			view.setBackgroundColor(Color.CYAN);
    		else
    			view.setBackgroundColor(Color.WHITE);
     
    		return view;
    	}
    }

  8. #8
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    Pourquoi ne pas stocker des infos dans les items, avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .setId(..)
    .setTag(..)
    Ca fonctionne très bien même dans des listeners

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Bonjour hotcryx,

    Je ne voit pas où tu veut en venir? Et encore moins le rapport avec la problématique énoncé.

    Tu veut bien détailler un peu plus?

  10. #10
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 970
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    En fait, il recherche un child.

    On peut les retrouver en les parsant et en recherchant l'info les identifiants.

  11. #11
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Par défaut
    Bonjour,

    Ta solution fonctionne parfaitement merci Minicalion.

    Beaucoup plus simple ta solution

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/04/2015, 16h41
  2. Réponses: 3
    Dernier message: 18/01/2015, 18h30
  3. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  4. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  5. Sélectionner une ligne dans une DBGrid
    Par RBIK dans le forum Bases de données
    Réponses: 13
    Dernier message: 01/07/2004, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo