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 :
Existe-t-il un moyen d'y remédier ?