3 votes

Android : Trier des valeurs entières dans un ListView

Je suis en train de créer une liste de scores élevés. La ListView a 2 éléments, le nom du joueur et le score. Le score est une valeur entière. J'utilise Collections.sort, mais au démarrage de l'activité, la liste n'est pas triée. J'ai déjà chargé des valeurs fictives pour la liste. Celles-ci sont déclarées dans strings.xml comme des tableaux de chaînes. Voici l'extrait de mon onCreate :

   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    backgroundMusic = MediaPlayer.create(HighScores.this, R.raw.highscore);
    backgroundMusic.setLooping(true);
    backgroundMusic.start();

    String databasePath = getAbsolutePath("highscore.dbs");

    // open the database
    try {
        db = StorageFactory.getInstance().createStorage();
        db.open(databasePath, 40 * 1024);
        Toast.makeText(this, "HERE", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // check if a root object is present in this file
    Index<FetchDetails> root = (Index<FetchDetails>) db.getRoot();
    if (root == null) {
        // Root is not yet defined: storage is not initialized
        root = (Index) db.createIndex(String.class, false);
        String[] nameList = getResources().getStringArray(
                R.array.name_array);
        String[] scoreList = getResources().getStringArray(
                R.array.score_array);
        for (int i = 0; i < scoreList.length; i++) {
            FetchDetails populate = new FetchDetails();
            populate.setName(nameList[i]);
            populate.setScore(scoreList[i]);
            root.put(populate.getScore(), populate);
            db.setRoot(root);
        }

    }

    String filter = "";
    ArrayList<FetchDetails> items = root.getPrefixList(filter);
    results = new ArrayList<FetchDetails>();
    ScoreComparator compare = new ScoreComparator();
    for (int i = 0; i < items.size(); i++) {
        FetchDetails arraylist = new FetchDetails();
        arraylist.setName(items.get(i).getName());
        arraylist.setScore(items.get(i).getScore());
        results.add(arraylist);
        Collections.sort(results, compare);
    }

    adapter = new CustomAdapter(results);
    setListAdapter(adapter);
    updateList();

}

Ma liste de mise à jour :

   private void updateList() {
    // TODO Auto-generated method stub
    Intent updateIntent = getIntent();
    if ((updateIntent.getStringExtra(HighScores.NAME) != null)
            &&   (updateIntent.getStringExtra(MegamanStrikes.PLAYER_SCORE) != null)) {
        FetchDetails updateList = new FetchDetails();
        ScoreComparator compare = new ScoreComparator();
        updateList.setName(updateIntent.getStringExtra(HighScores.NAME));
        updateList.setScore(updateIntent
                .getStringExtra(MegamanStrikes.PLAYER_SCORE));

        Toast.makeText(this, updateIntent.getStringExtra(MegamanStrikes.PLAYER_SCORE), Toast.LENGTH_SHORT).show();
        Toast.makeText(this, updateIntent.getStringExtra(HighScores.NAME), Toast.LENGTH_SHORT).show();

        results.add(updateList);
        adapter.notifyDataSetChanged();
        Collections.sort(results, compare);

        Index<FetchDetails> rootEdit = (Index<FetchDetails>) db.getRoot();
        rootEdit.put(updateList.getScore(), updateList);
        db.setRoot(rootEdit);
    }

}

Ma classe Fetch Details

package com.cs119.megamanstrikes;

import org.garret.perst.Persistent;

public class FetchDetails extends Persistent implements Comparable<FetchDetails> {

    private String name;
    private String score;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getScore() {
    return score;
}

public void setScore(String score) {
    this.score = score;
}

@Override
public int compareTo(FetchDetails another) {
    // TODO Auto-generated method stub
    return score.compareTo(another.score);
}

}

Mon adaptateur personnalisé

  private class CustomAdapter extends BaseAdapter {

    Index<FetchDetails> root = (Index<FetchDetails>) db.getRoot();
    String filter = "";
    ArrayList<FetchDetails> items = root.getPrefixList(filter);

    public CustomAdapter(ArrayList<FetchDetails> highscore) {
        items = highscore;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return items.size();
    }

    @Override
    public Object getItem(int index) {
        // TODO Auto-generated method stub
        return items.get(index);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = getLayoutInflater();
        View view;

        if (convertView == null) {
            view = inflater.inflate(R.layout.row, null);
        } else {
            view = convertView;
        }

        // extract the views to be populated
        TextView Name = (TextView) view.findViewById(R.id.name);
        TextView Score = (TextView) view.findViewById(R.id.score);

        FetchDetails score = items.get(position);

        Name.setText(score.getName());
        Score.setText(score.getScore());

        // return the view
        return view;
    }
}

Ma classe Comparator utilisée comme second paramètre pour le tri (je ne suis même pas sûr que ce soit nécessaire !)

            package com.cs119.megamanstrikes;

import java.util.Comparator;

class ScoreComparator implements Comparator<FetchDetails> {

@Override
public int compare(FetchDetails objA, FetchDetails objB) {
    // TODO Auto-generated method stub
    return objA.getScore().compareTo(objB.getScore());
}
}

Et pourtant, le résultat est toujours le même :

enter image description here

Existe-t-il un moyen d'y remédier ?

3voto

Tobias Ritzau Points 2613

Vous triez la liste à chaque fois que vous ajoutez une valeur, ce qui n'est pas nécessaire, et vous triez le score sous forme de chaînes, ce qui n'est pas ce que vous voulez. Il est probable que vous souhaitiez les convertir en nombres entiers. Une implémentation typique de compareTo() est de prendre une valeur - l'autre, donc dans votre cas quelque chose comme :

return Integer.parseInt(objB.getScore()) - Integer.parseInt(objA.getScore());

Et vous avez trié par ordre croissant, ce qui n'est probablement pas ce que vous voulez non plus. (J'ai corrigé cela dans le code ci-dessus en changeant objA et objB .

0voto

Thomas Points 1523

La sortie n'est-elle pas correcte ? Vous ne triez pas dans l'ordre inverse...

Vous pouvez utiliser quelque chose comme

Collections.reverseOrder();

ou modifier la méthode de comparaison surchargée...

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