Android ListView avec onClick articles
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 faire les éléments (Dell, Samsung Galaxy S3, etc) pour appeler une fonction pour ouvrir une nouvelle activité avec des informations différentes chacun.
Par exemple:
Si je touche Dell, une nouvelle activité doit apparaître en me montrant des informations sur Dell. Si je touche Samsung, le même chose.
J'ai googlé mais je n'ai rien trouvé d'utile, aucun indice? Je pense que c'est basique, mais je suis nouveau donc je ne sais pas vraiment par où commencer
9 réponses
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 le 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 est de passer d'une classe qui implémente parcelable dans l'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 intent et putExtra une classe entière dans l'intention. La classe que j'envoie a implémenté parcelable. Astuce: vous avez seulement besoin d'implémenter l'analysable sur ce qui est minimum nécessaire pour recréer la classe. Ie peut-être un nom de fichier ou quelque chose de simple comme une chaîne quelque chose qu'un constructeur peut utiliser pour créer la classe. La nouvelle activité peut plus tard getExtras et elle crée essentiellement une copie de la classe avec sa méthode constructeur.
Ici, je lance la classe kmlreader de mon application quand je reçois un onclick dans le listview.
Note: le résumé ci-dessous est une liste de la classe que je passe donc get (position) renvoie la classe en fait est la même liste qui remplit le listview
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 retire 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 (View
) doit être gonflé si sa valeur est null
, profiter de et un onClickListener()
juste après le gonflage.
En supposant qu'il 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 la façon d'étendre ArrayListAdapter
, je recommande ce lien .
Bien dans votre onitemClick
, vous pourrez envoyer la valeur sélectionnée comme deal
, et l'envoyer à votre intention lors de l'ouverture d'une nouvelle activité et dans votre nouvelle activité obtenir les données envoyées et liés à l'élément sélectionné l'affichage de vos données
Pour obtenir le nom du list
String item = yourData.get(position).getName();
Pour définir des données dans intent
intent.putExtra("Key", item);
Pour obtenir les données de la 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);
}
});
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);
}
});
Pour quel genre D'enfer implémenter Parcelable ?
Il passe à la chaîne d'adaptateur [] donc
- récupère l'élément (chaîne) à la position
- créer l'intention
- mettez-le comme extra
- démarrer l'activité
- dans l'activité obtenir supplémentaire
Pour stocker la liste des produits, vous pouvez utiliser ici HashMap (par exemple en tant qu'objet statique)
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 u passer à Adaptateur Ensemble de touches comme:
String[] productNames = _hashMap.keySet().toArray(new String[_hashMap.size()]);
Lorsque l'adaptateur u retour vue u auditeur comme ceci par exemple:
@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 statique publique servant de clé pour extra
Ps. désolé pour la faute de frappe, j'étais pressé :) la ps2. cela devrait vous donner une idée de comment le faire la ps3. quand j'aurai plus de temps, je vais ajouter une description détaillée
MON COMMENTAIRE:
- N'UTILISEZ AUCUN COMMUTATEUR Déclaration
- NE CRÉEZ PAS D'ACTIVITÉS DISTINCTES POUR CHAQUE PRODUIT ( VOUS N'AVEZ BESOIN QUE D'UNE SEULE)
J'ai pu contourner le tout en remplaçant la référence de 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);
}
});