5 votes

Donner des tags aux éléments d'une listview sans adaptateur de tableau personnalisé

J'ai une question qui devrait être simple, mais je n'arrive pas à la résoudre.

J'utilise DragSortListView . Je veux donner à chaque élément de la vue de liste une étiquette avec son emplacement d'origine. Lorsque l'utilisateur a fini de réordonner, je veux renvoyer une chaîne avec les identifiants d'origine (comme 2,3,4,1 si l'utilisateur a déplacé le premier élément à la dernière place). Si un élément est supprimé, j'aimerais également connaître l'identifiant d'origine.

Voici mon code.

DragSortListView mainListView = (DragSortListView) findViewById( R.id.list_pages );  
String[] names = settings.getString("pages", "Error,error").split(",");    
ArrayList<String> list = new ArrayList<String>(Arrays.asList(names));
adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.row, list);
mainListView.setAdapter(adapter);
DragSortController controller = new DragSortController(mainListView);
...

J'ai pensé qu'il serait préférable de passer en revue tous les éléments et de leur attribuer des étiquettes avec leurs identifiants d'origine. J'essaie de parcourir les éléments en utilisant quelque chose comme ceci

for (int i = 0; i < mainListView.getCount(); i++)
{
  View v = mainListView.getChildAt(i);
  TextView tx = (TextView) v.findViewById(R.id.text);
  tx.setTag(i);
}

Cependant, cette liste semble être vide, bien que l'adaptateur ait été défini.

Je ne peux pas utiliser un adaptateur de tableau personnalisé, car l'application se bloquerait lorsqu'un élément est déposé ou balayé.

Informations complémentaires : La vue en liste est remplie lorsque les données sont renvoyées par un service utilisant un BroadcastReceiver. Je ne pense pas que cela ait une influence, mais on ne sait jamais.

Ma question :

  • Comment puis-je stocker la position d'origine de chaque élément de la liste, afin de pouvoir y accéder ultérieurement ?

Merci d'avance !

8voto

Ahmad Points 21923

Si vous ne souhaitez pas utiliser un fichier Adapter Vous pouvez alors procéder de la manière suivante :

    List<Item> dataForTheAdapter = new ArrayList<Item>();

    // 'dataRetrivedfromService' is the data, that gets returned by the service
    for (int counter = 0; counter < dataRetrivedfromService.size(); counter++) {
        dataForTheAdapter.add(new Item(dataRetrivedfromService.get(counter), counter));
    }

    mContext = MyActivity.this;
    mAdapter = new ArrayAdapter<Item>(mContext, R.layout.row, dataForTheAdapter);

    ListView listView = (ListView) findViewById(R.id.listView);
    listView.setAdapter(mAdapter);

Ce code est assez explicite. Si vous regardez maintenant la classe Item.java, vous verrez que j'ai remplacé la classe toString() méthode. La méthode toString() est appelée sur l'objet fourni avec lequel la ListView veut remplir ses données.

public class Item {

    private String mText;
    private int mPosition;

    public Item(String text, int position) {

        this.mText = text;
        this.mPosition = position;
    }

    public int getPosition() {

        return mPosition;
    }

    public void setPosition(int position) {

        this.mPosition = position;
    }

    public String getText() {

        return mText;
    }

    public void setText(String text) {

        this.mText = text;
    }

    @Override
    public String toString() {

        return this.mText;
    }
}

Désormais, vous n'aurez plus besoin d'écrire un adaptateur personnalisé, mais vous pourrez remplir votre ListView avec un objet Item.

Pour vérifier si cela fonctionne, vous pouvez définir une valeur de OnItemClickListener sur votre ListView et faites ceci :

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Toast.makeText(mContext, String.valueOf(mAdapter.getItem(position).getPosition()), Toast.LENGTH_SHORT).show();
            }
        });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X