Carte réseau Android avec ArrayList et ListView ne se mettant pas à jour lorsque l'arraylist est modifié
J'ai une application android avec un écran qui se compose d'une ListView, je l'utilise pour afficher une liste des périphériques. Ces appareils sont détenus dans un tableau.
Je suis en train d'utiliser le ArrayAdapter pour afficher ce qui est dans le tableau sur l'écran dans une liste.
Il fonctionne lorsque j'ai d'abord charger le SetupActivity classe, cependant, il est la facilité pour ajouter un nouveau périphérique dans la addDevice() méthode, ce qui signifie que la matrice de la tenue de l'instrument est mis à jour.
Je suis en utilisant notifyDataSetChanged() qui est censé mettre à jour la liste, mais il ne semble pas fonctionner.
public class SetupActivity extends Activity
{
private ArrayList<Device> deviceList;
private ArrayAdapter<Device> arrayAdapter;
private ListView listView;
private DevicesAdapter devicesAdapter;
private Context context;
public void onCreate(Bundle savedInstanceState) //Method run when the activity is created
{
super.onCreate(savedInstanceState);
setContentView(R.layout.setup); //Set the layout
context = getApplicationContext(); //Get the screen
listView = (ListView)findViewById(R.id.listView);
deviceList = new ArrayList<Device>();
deviceList = populateDeviceList(); //Get all the devices into the list
arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList);
listView.setAdapter(arrayAdapter);
}
protected void addDevice() //Add device Method (Simplified)
{
deviceList = createNewDeviceList(); //Add device to the list and returns an updated list
arrayAdapter.notifyDataSetChanged(); //Update the list
}
}
N'importe qui peut voir où je vais mal?
source d'informationauteur Pippa Rose Smith
Vous devez vous connecter pour publier un commentaire.
Pour un ArrayAdapter,
notifyDataSetChanged
ne fonctionne que si vous utilisez leadd
insert
remove
etclear
fonctions sur la Carte.arrayAdapter.clear()
arrayAdapter.add(deviceList)
Alternatives:
Répétez cette étape une fois la nouvelle devicelist est formé, mais ce n'est
redondant
vous donne plus de flexibilité. C'est le plus recommandé.
Alors que l'on a accepté de répondre à résoudre le problème, l'explication de pourquoi est incorrect, et puisque c'est un concept important, je pensais que je voudrais essayer de préciser. Slartibartfast explication
notifyDataSetChanged()
ne fonctionne que lorsqueadd
insert
,remove
ouclear
est appelée sur la carte est incorrecte. Cette explication est vrai de lasetNotifyOnChange()
méthode, qui, si mis à true (par défaut) appelle automatiquementnotifyDataSetChanged()
lorsque l'un quelconque de ces quatre actions se produisent. Je pense que l'affiche confondu les deux méthodes.notifyDatasetChanged()
lui-même ne dispose pas de ces restrictions. Il dit juste la carte qui la liste, il est à la recherche à la a changé, et il n'a pas d'importance comment la modification de la liste s'est réellement passé. Bien que je ne peux pas voir le code source de votrecreateNewDeviceList()
je pense que votre problème vient du fait que vous avez eu la carte du référencement de l'original de la liste que vous avez créé, puis vous avez créé une nouvelle liste danscreateNewDeviceList()
et depuis que l'adaptateur était toujours pointer sur l'ancienne liste il ne pouvait pas voir les changements. La solution slartibartfast mentionné fonctionne parce qu'il efface de la carte et plus précisément ajoute à la liste mise à jour de cette carte. Ainsi, vous n'avez pas le problème de votre carte de pointage à la mauvaise place. Espérons que cela aide quelqu'un!votre méthode addDevice est à l'origine une boucle sans fin. Ne pas appeler une méthode à partir de lui-même comme vous le faites ici :