web-dev-qa-db-fra.com

Sélectionnez par programme l’élément ListView dans Android

J'ai deux fragments. Le premier avec des boutons à l'intérieur, l'autre avec un ListView à l'intérieur (ListFragment).

Je voudrais que le premier fragment (grâce à ses boutons) permette à l'utilisateur de parcourir le ListView qui se trouve dans le second fragment.

Donc, je veux que le ListView soit contrôlé par le premier fragment avec des boutons.

Je n'ai aucun problème à communiquer entre fragments (envoi des ordres du premier au deuxième), mais je ne sais pas comment demander à mon ListView de sélectionner (par programme) un élément de liste particulier.

Quel type de ListView dois-je utiliser et comment puis-je demander à ListView de sélectionner/mettre en surbrillance/mettre en évidence l'un de ses éléments?

Je suis en mode tactile lorsque l'utilisateur appuie sur les boutons du premier fragment.

Devrais-je utiliser setFocusableInTouchMode(true) ou setChoiceMode(ListView.CHOICE_MODE_SINGLE) ou autre chose?

50
Jecimi

Ceci est pour tout le monde essayant de:

-Sélectionne par programme un élément dans un ListView

-Rendre cet élément rester en surbrillance

Je travaille sur Android ICS, je ne sais pas si cela fonctionne pour tous les niveaux Api.

Commencez par créer une listview (ou obtenez-la si vous êtes déjà dans une listActivity/listFragment)

Alors définissez le mode de choix de votre listview sur single avec: Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

Alors sélectionnez votre article par programme avec: Mylistview.setItemChecked(position, true); (la position étant un entier indiquant le rang de l'élément à sélectionner)

Votre article est maintenant sélectionné, mais vous ne verrez peut-être absolument rien car il n'y a pas de retour visuel de la sélection. Maintenant vous avez deux options: vous pouvez utiliser une listview prédéfinie ou votre listview personnalisée.

1) Si vous voulez une vue liste prédéfinie, essayez simple_list_item_activated_1, simple_list_item_checked, simple_list_item_single_choice, Etc ...

Vous pouvez configurer votre liste comme ceci pour par exemple: setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

après avoir sélectionné la vue de liste prédéfinie que vous avez choisie, vous verrez maintenant que, lorsque cette option est sélectionnée, une case à cocher est cochée ou que la couleur d'arrière-plan est modifiée, etc.

2) Si vous utilisez une liste personnalisée, vous définissez une présentation personnalisée à utiliser dans chaque élément. Dans cette présentation XML, vous attribuez un sélecteur à chaque vue de pièce de votre ligne, qui doit être modifiée lors de la sélection.

Supposons que, lorsque cette option est sélectionnée, vous souhaitez que votre ligne modifie la couleur du texte et la couleur de l'arrière-plan. Votre mise en page XML peut être écrite comme suit:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/menu_item_background_selector"
    Android:orientation="horizontal" >

<TextView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:gravity="center_vertical"
    Android:textColor="@drawable/menu_item_text_selector" />

Maintenant, dans le dossier pouvant être dessiné, vous créez menu_item_background_selector.xml et menu_item_text_selector.xml.

menu_item_text_selector.xml:

 <?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item Android:state_activated="true"
     Android:color="#FFF">
</item>

<item Android:state_pressed="true"
     Android:color="#FFF">
</item>

<item Android:state_pressed="false"
     Android:color="#000">
</item>

</selector>

Le texte sera blanc lorsqu'il sera sélectionné.

Ensuite, faites quelque chose de similaire pour votre arrière-plan: (rappelez-vous que vous n'êtes pas obligé d'utiliser la couleur mais que vous pouvez également utiliser des éléments dessinables)

menu_item_background_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:Android="http://schemas.Android.com/apk/res/Android">


        <item Android:state_activated="true"
        Android:color="#0094CE">
        </item>

        <item Android:state_pressed="true"
        Android:color="#0094CE">
        </item>

        <item Android:state_pressed="false"
        Android:color="#ACD52B">
        </item>


      </selector>

Ici, l'arrière-plan est bleu lorsqu'il est sélectionné et vert lorsqu'il n'est pas sélectionné.

L'élément principal qui me manquait était Android:state_activated. Il y a en effet (trop) beaucoup d'états: activé, appuyé, concentré, vérifié, sélectionné ...

Je ne suis pas sûr si l'exemple que j'ai donné avec Android:state_activated Et Android:state_pressed Est le meilleur et le plus propre, mais cela semble fonctionner pour moi.

Mais je n'avais pas besoin de faire ma propre classe pour obtenir un CheckableRelativeLayout personnalisé (ce qui était sale et effrayant), ni j'ai utilisé CheckableTextViews. Je ne sais pas pourquoi d'autres ont utilisé de telles méthodes, cela dépend peut-être du niveau de l'API.

135
Jecimi

Essayez AbsListView.performItemClick (...)

Voir cet article pour savoir comment utiliser performItemClick.

15
AlikElzin-kilaka

C'est ce qui a fonctionné pour moi:

1) Définissez le comportement de choix pour la liste.

 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

2) Définit l'état coché de la position spécifiée.

mListView.setItemChecked(1,true); //Don't make the same mistake I did by calling this function before setting the listview adapter.

3) Ajoutez un nouveau style dans la ressource de style (res/values) comme ceci:

<style name="activated" parent="Android:Theme.Holo">
<item name="Android:background">@Android:color/holo_green_light</item>
</style>

N'hésitez pas à utiliser les couleurs de votre choix.

4) Utilisez le style précédemment défini dans votre ListView:

<ListView
        Android:id="@+id/listview"
        style="@style/activated"
        Android:layout_width="0dp"
        Android:layout_height="match_parent"
        Android:layout_weight="1"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="0dp"/>

Ou dans la mise en page que vous utilisez comme ligne.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="match_parent"
  Android:layout_height="wrap_content" 
  style="@style/activated"
>
  <!--widgets for your row here-->

</LinearLayout>

J'espère que ça aide n'importe qui!

8
Axel

Essayez mListView.setSelection(position);

5
J_D

La réponse de Jecimi a fonctionné pour moi, sauf pour une petite partie. Je voudrais le partager pour les autres. L'appel de list.setItemChecked( 0, true ); dans onCreate () de FragmentActivity n'a pas fonctionné. Dans getView() de l'adaptateur list.getCheckedItemPosition( ) a retourné -1.

Je dois appeler cette méthode de protected void onPostCreate( Bundle savedInstanceState ).

4
Swapnil Chaudhari
package com.example.samsung;

import com.example.samsung.*;
import com.example.samsung.R;

import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Intent;
import Android.view.Menu;
import Android.view.View;
import Android.widget.AdapterView;
import Android.widget.AdapterView.OnItemSelectedListener;
import Android.widget.ArrayAdapter;
import Android.widget.Button;
import Android.widget.ListView;
import Android.widget.Spinner;
import Android.widget.Toast;

public class Firstscreen extends Activity implements OnItemSelectedListener {
    Button btn;
     Spinner sp;
     public String[] product = { "ML-1676P/XIP","SLM2021W/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M3320ND/XIP","SL-M3820ND/XIP","SL-M4020ND/XIP"};  


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_firstscreen);
        btn = (Button) findViewById(R.id.bn);
        sp= (Spinner) findViewById(R.id.sp);
    }
        public void button (View v){
            {

        Intent i = new Intent(Firstscreen.this,ML1676P.class);
        startActivity(i);
        }

        Spinner s1 = (Spinner) findViewById(R.id.sp);
        ArrayAdapter<String> adapter 
        = new ArrayAdapter<String>(this, 
                Android.R.layout.simple_spinner_item, product); // find other layout parameters
        s1.setAdapter(adapter);
        s1.setOnItemSelectedListener(new OnItemSelectedListener()
        {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }

    });
    }

    private Object product() {
            // TODO Auto-generated method stub
            return null;
        }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.firstscreen, menu);
        return true;
    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub


    }



}
<LinearLayout 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=".Firstscreen"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/tv1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:textColor="#FF35B5E5"
        Android:layout_centerInParent="true"
        Android:text="CHOOSE THE PRODUCT FROM THE LIST" />

    <Spinner
        Android:id="@+id/sp"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="10dp"
        Android:drawSelectorOnTop="true" />

    <Button
        Android:id="@+id/bn"
        Android:layout_width="285dp"
        Android:layout_height="wrap_content"
        Android:text="       GO             " 
        Android:onClick="button"/>


</LinearLayout>

sélectionnez un élément dans une liste; il devrait aller à la page spécifique de l'élément sélectionné lorsque vous cliquerez sur le bouton, comment le faire. Le code est extrait dans l'extrait ci-dessus.

0
Hasid Mansoori

Vous pouvez utiliser ListView#setSelection(int)

0
asenovm

J'aime ça:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            try {
                int pos = 0;
                listview.performItemClick(null, pos, listview.getItemIdAtPosition(pos) );
            } catch (Exception e) {
                e.printStackTrace();
            }
        } 
    }
0
Faisal Shaikh