Ajouter dynamiquement des éléments à la vue de liste à l'aide d'un adaptateur personnalisé pour l'application Android
Alors, maintenant, j'ai une classe personnalisée qui prend un tableau d'Emplacements et de les ajouter à une Liste. Tout ceci est bel et bon, mais je voudrais ajouter des Emplacements à cette liste après cette initialisation. Par exemple, quelqu'un peut "ajouter un Lieu" et il va ajouter à cette liste. Ici, c'est mon Activité Principale:
package com.example.listviewtest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView listView1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Location location_data[] = new Location[]
{
new Location(R.drawable.ic_launcher, "Location 1", "Fruit!", "2 miles", "8-4 mon-fri\nclosed sun"),
new Location(R.drawable.ic_launcher, "Location 2", "Veggies!", "2 miles", "8-5"),
new Location(R.drawable.ic_launcher, "Location 3", "Plants!", "2 miles", "8-5"),
new Location(R.drawable.ic_launcher, "Location 4", "Flowers!", "2 miles", "8-5"),
new Location(R.drawable.ic_launcher, "Location 5", "Baked Goods!", "2 miles", "8-5")
};
LocationAdapter adapter = new LocationAdapter(this,
R.layout.listview_item_row, location_data);
//adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5"));
listView1 = (ListView)findViewById(R.id.listView1);
View header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null);
listView1.addHeaderView(header);
listView1.setAdapter(adapter);
}
}
Cela fonctionne. Je veux maintenant faire quelque chose comme adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5"));
APRÈS le remplissage avec de la matrice.
Voici mon LocationAdapter classe:
package com.example.listviewtest;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class LocationAdapter extends ArrayAdapter<Location>{
Context context;
int layoutResourceId;
Location data[] = null;
public LocationAdapter(Context context, int layoutResourceId, Location[] data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
LocationHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new LocationHolder();
holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
holder.details = (TextView)row.findViewById(R.id.details);
holder.distance = (TextView)row.findViewById(R.id.distance);
holder.hours = (TextView)row.findViewById(R.id.hours);
row.setTag(holder);
}
else
{
holder = (LocationHolder)row.getTag();
}
Location location = data[position];
holder.txtTitle.setText(location.title);
holder.imgIcon.setImageResource(location.icon);
holder.details.setText(location.details);
holder.distance.setText(location.distance);
holder.hours.setText(location.hours);
return row;
}
static class LocationHolder
{
ImageView imgIcon;
TextView txtTitle;
TextView details;
TextView distance;
TextView hours;
}
}
Des idées sur comment je peux le mettre en œuvre? Merci.
source d'informationauteur user1282637
Vous devez vous connecter pour publier un commentaire.
Locations data[]
de la matrice deArrayList<Location>
et remplacer le constructeur appropriédata
un champ (typeArrayList<Location>
)data.add(location)
notifyDatasetChanged()
sur votre carteExemple de code.
Stocker vos données dans un
ArrayList<Location>
au lieu de simplementLocation[]
et ensuite faire une classe publique dans votre liste de carte:Ensuite, lorsque vous voulez ajouter un élément à la liste, il suffit d'appeler
location_data.add(new_location)
.Edit: Il semble que vous avez votre choix à partir de plusieurs la plupart des cas identiques réponses.
Ressemble vous avez besoin pour remplacer la méthode add dans votre LocationAdapter classe pour ajouter l'objet à la liste interne
Cette mise en œuvre nécessite la modification des données d'une liste de tableaux au lieu de simplement un tableau, sinon, vous avez le code de la matrice de re-dimensionnement vous-même.
Si vous ne le faites pas, les données internes restent inchangées et un appel pour ajouter volonté de ne pas modifier la liste. C'est mauvais parce que vous utilisez la variable de données pour obtenir les valeurs pour les points de vue.
Dans votre activité principale, je vous recommande d'utiliser une ArrayList< Location > plutôt que de l'Emplacement[] pour le rendre plus facile d'ajouter de nouveaux éléments location. Alors, plutôt que d'avoir LocationAdapter étendre ArrayAdapter< Location >, ont-il étendre ListAdapter< Location >, de sorte que vous pouvez passer votre ArrayList< Location >.
Cela dit, tout ce que vous devez faire dans votre addLocation(Emplacement l) méthode dans votre MainActivity, est d'ajouter un élément à l'Emplacement[] ou ArrayList< Location > structure de données que vous avez passé de votre carte, puis composez le:
Notez que vous aurez besoin pour rendre votre carte une variable de membre dans votre MainActivity pour permettre l'accès à l'extérieur de votre onCreate().