pourquoi cette fonction ne supprime pas les chaînes en double de la liste?
Parce que vous n'êtes pas traiter String
s, vous avez affaire à AndroidAppProcess
et si vous voyez le structure of this class:
public class AndroidAppProcess extends AndroidProcess {
private static final boolean SYS_SUPPORTS_SCHEDGROUPS = new File("/dev/cpuctl/tasks").exists();
/** {@code true} if the process is in the foreground */
public final boolean foreground;
/** The user id of this process. */
public final int uid;
...
vous pouvez voir que chaque processus android est attribué un identifiant unique. Maintenant, les possibilités sont que tous les processus de votre liste sont uniques. Donc, quand vous les convertissez en Set
il n'y a pas de doublon et donc rien n'est supprimé.
Toutefois, si vous auriez eu affaire à String
pur, alors définitivement les doublons seraient supprimés, comme indiqué dans this réponse.
Méthode 1
Comme mentionné dans this réponse, A HashSet
utilise une mise en oeuvre Map
, qui à son tour, utilise hashCode()
et equals()
pour éviter les doublons.
Une façon de résoudre le problème est de passer outre hashCode()
et equals()
dans la classe AndroidAppProcess
, de sorte qu'il représente vos equals()
critères
Par exemple:
public class AndroidAppProcess extends AndroidProcess {
...
...
@Override
public boolean equals(Object o) {
//return <write a logic that compare this AndroidAppProcess with another AndroidAppProcess.
}
@Override
public int hashCode() {
//return <this androidProcess name>.hashCode();
}
}
Méthode 2
Vous pouvez utiliser un TreeSet
au lieu de HashSet
avec un comparateur personnalisé qui compare les tableaux de chaînes pour l'égalité.
private void detectApps() {
//TODO: here set the running apps list to the Adapter
m_processesList =AndroidProcesses.getRunningAppProcesses();
//use TreeSet instead of HashSet
Set<AndroidAppProcess> set= new TreeSet<>(new Comparator<AndroidAppProcess>() {
@Override
public int compare(AndroidAppProcess o1, AndroidAppProcess o2) {
return /* Write a code that compares two AndroidAppProcess
For example you can write:
return o1.getPackageName() == o2.getPackageName();
P.S.: I'm not sure as what's the method to get the correct name,
but you get the idea so you can search the library to get the correct name.
*/
}
});
set.addAll(m_processesList);
m_processesList.clear();
m_processesList.addAll(set);
runningAppsAdapter=new AppsAdapter(RunningAppsActivity.this,R.layout.list_item,m_processesList);
m_listView.setAdapter(runningAppsAdapter);
runningAppsAdapter.notifyDataSetChanged();
}
Merci de me rappeler que .... pouvez-vous me dire comment obtenir la liste requise – sam
@sam Voir la réponse éditée pour Plus d'informations. –
J'ai ajouté ces followings mais après avoir comparé, il ne retourne que le nom du paquet unique – sam