Je suis un nouveau programmeur et nouveau dans Android. J'utilise cet exemple http://www.androidhive.info/2012/09/Android-adding-search-functionality-to-listview/ et cela fonctionne très bien.
Maintenant, je veux que les éléments (Dell, Samsung Galaxy S3, etc.) appellent une fonction pour ouvrir une nouvelle activité avec des informations différentes chacune.
Par exemple:
Si je touche Dell, une nouvelle activité doit apparaître et afficher des informations sur Dell. Si je touche Samsung, la même chose.
J'ai cherché sur Google mais je n'ai rien trouvé qui puisse vous aider. Je pense que c'est fondamental, mais je suis nouveau, donc je ne sais pas vraiment par où commencer
Dans votre activité, où vous avez défini votre listview
vous écrivez
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?>adapter,View v, int position){
ItemClicked item = adapter.getItemAtPosition(position);
Intent intent = new Intent(Activity.this,destinationActivity.class);
//based on item add info to intent
startActivity(intent);
}
});
dans getItem de votre adaptateur, vous écrivez
public ItemClicked getItem(int position){
return items.get(position);
}
Vous commencez de nouvelles activités avec des intentions. Une méthode pour envoyer des données à une intention consiste à transmettre une classe qui implémente parcellable dans cette intention. Prenez note que vous passez une copie de la classe.
http://developer.Android.com/reference/Android/os/Parcelable.html
Ici, j'ai un onItemClick. Je crée une intention et mets une classe entière dans cette intention. La classe que j'envoie a implémenté parcellaire. Conseil: Il vous suffit d'implémenter le paramètre analysable par rapport au minimum nécessaire pour recréer la classe. C'est-à-dire un nom de fichier ou quelque chose de simple, comme une chaîne, qu'un constructeur peut utiliser pour créer la classe. La nouvelle activité peut obtenir plus tard Extrtras et il s’agit essentiellement de créer une copie de la classe avec sa méthode constructeur.
Ici, je lance la classe kmlreader de mon application lorsque je reçois un onclick dans la liste.
Note: en dessous de sommaire se trouve une liste de la classe que je passe, donc get (position) retourne la classe, mais c'est la même liste que celle qui remplit la liste
List<KmlSummary> summary = null;
...
public final static String EXTRA_KMLSUMMARY = "com.gosylvester.bestrides.util.KmlSummary";
...
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
lastshownitem = position;
Intent intent = new Intent(context, KmlReader.class);
intent.putExtra(ImageTextListViewActivity.EXTRA_KMLSUMMARY,
summary.get(position));
startActivity(intent);
}
plus tard dans la nouvelle activité, je sors la classe analysable avec
kmlSummary = intent.getExtras().getParcelable(
ImageTextListViewActivity.EXTRA_KMLSUMMARY);
//note:
//KmlSummary implements parcelable.
//there is a constructor method for parcel in
// and a overridden writetoparcel method
// these are really easy to setup.
public KmlSummary(Parcel in) {
this._id = in.readInt();
this._description = in.readString();
this._name = in.readString();
this.set_bounds(in.readDouble(), in.readDouble(), in.readDouble(),
in.readDouble());
this._resrawid = in.readInt();
this._resdrawableid = in.readInt();
this._pathstring = in.readString();
String s = in.readString();
this.set_isThumbCreated(Boolean.parseBoolean(s));
}
@Override
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeInt(this._id);
arg0.writeString(this._description);
arg0.writeString(this._name);
arg0.writeDouble(this.get_bounds().southwest.latitude);
arg0.writeDouble(this.get_bounds().southwest.longitude);
arg0.writeDouble(this.get_bounds().northeast.latitude);
arg0.writeDouble(this.get_bounds().northeast.longitude);
arg0.writeInt(this._resrawid);
arg0.writeInt(this._resdrawableid);
arg0.writeString(this.get_pathstring());
String s = Boolean.toString(this.isThumbCreated());
arg0.writeString(s);
}
Bonne chance Danny117
Vous devriez certainement vous étendre ArrayListAdapter
et l'implémenter dans votre méthode getView()
. Le deuxième paramètre (un View
) devrait être gonflé si sa valeur est null
, en tirer parti et le définir comme un onClickListener()
juste après le gonflage.
En supposant que cela s'appelle votre deuxième paramètre de getView()
s'appelle convertView
:
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(final View v) {
if (isSamsung) {
final Intent intent = new Intent(this, SamsungInfo.class);
startActivity(intent);
}
else if (...) {
...
}
}
}
Si vous voulez des informations sur comment étendre ArrayListAdapter
, je vous recommande ceci lien .
bien dans votre onitemClick
vous enverrez la valeur sélectionnée comme deal
, et l'enverrez dans votre intention lorsque vous ouvrez une nouvelle activité et que dans votre nouvelle activité, les données envoyées et liées à l'élément sélectionné afficheront votre Les données
obtenir le nom du list
String item = yourData.get(position).getName();
définir des données dans l'intention
intent.putExtra("Key", item);
pour obtenir les données en deuxième activité
getIntent().getExtras().getString("Key")
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(getActivity(), DiscussAddValu.class);
startActivity(i);
}
});
pour quel genre d'enfer implémentant Parcelable?
il passe à l'adaptateur String [] donc
pour stocker la liste de produits que vous pouvez utiliser ici HashMap (par exemple comme objet STATIC)
exemple de classe décrivant le produit:
public class Product {
private String _name;
private String _description;
private int _id
public Product(String name, String description,int id) {
_name = name;
_desctription = description;
_id = id;
}
public String getName() {
return _name;
}
public String getDescription() {
return _description;
}
}
Product Dell = new Product("Dell","this is Dell",1);
HashMap<String,Product> _hashMap = new HashMap<>();
_hashMap.put(Dell.getName(),Dell);
puis vous passez à un jeu de clés de l’adaptateur en tant que:
String[] productNames = _hashMap.keySet().toArray(new String[_hashMap.size()]);
lorsque vous êtes dans l'adaptateur, retournez la vue et définissez le programme d'écoute comme ceci:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Context context = parent.getContext();
String itemName = getItem(position)
someView.setOnClikListener(new MyOnClickListener(context, itemName));
}
private class MyOnClickListener implements View.OnClickListener {
private String _itemName;
private Context _context
public MyOnClickListener(Context context, String itemName) {
_context = context;
_itemName = itemName;
}
@Override
public void onClick(View view) {
//------listener onClick example method body ------
Intent intent = new Intent(_context, SomeClassToHandleData.class);
intent.putExtra(key_to_product_name,_itemName);
_context.startActivity(intent);
}
}
puis dans une autre activité:
@Override
public void onCreate(Bundle) {
String productName = getIntent().getExtra(key_to_product_name);
Product product = _hashMap.get(productName);
}
* key_to_product_name est une chaîne publique statique servant de clé supplémentaire.
ps. désolé pour la faute de frappe j'étais pressé :) ps2. cela devrait vous donner une idée de comment le faire ps3. quand j'aurai plus de temps, je vais ajouter une description détaillée
MON COMMENTAIRE
J'ai pu contourner le problème en remplaçant la référence au contexte de this
ou Context.this
à getapplicationcontext
.
listview.setOnItemClickListener(new OnItemClickListener(){
//setting onclick to items in the listview.
@Override
public void onItemClick(AdapterView<?>adapter,View v, int position){
Intent intent;
switch(position){
// case 0 is the first item in the listView.
case 0:
intent = new Intent(Activity.this,firstActivity.class);
break;
//case 1 is the second item in the listView.
case 1:
intent = new Intent(Activity.this,secondActivity.class);
break;
case 2:
intent = new Intent(Activity.this,thirdActivity.class);
break;
//add more if you have more items in listView
startActivity(intent);
}
});
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?>adapter,View v, int position){
Intent intent;
switch(position){
case 0:
intent = new Intent(Activity.this,firstActivity.class);
break;
case 1:
intent = new Intent(Activity.this,secondActivity.class);
break;
case 2:
intent = new Intent(Activity.this,thirdActivity.class);
break;
//add more if you have more items in listview
//0 is the first item 1 second and so on...
}
startActivity(intent);
}
});