web-dev-qa-db-fra.com

Android ListView avec les éléments onClick

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

31
Agustín

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);
}
64
Lena Bru

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

5
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 .

4
nKn

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")
4
mohammed momn
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);
    }
});
4
Munna Sharma

pour quel genre d'enfer implémentant Parcelable?

il passe à l'adaptateur String [] donc

  • obtenir l'article (String) à la position
  • créer l'intention
  • mettre comme extra
  • commencer l'activité
  • en activité obtenez extra

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

  • N'UTILISEZ AUCUN ÉNONCÉ DE COMMUTATION
  • NE PAS CRÉER D'ACTIVITÉS SÉPARÉES POUR CHAQUE PRODUIT (U NÉCESSAIRE D'UN SEUL)
0
ceph3us

J'ai pu contourner le problème en remplaçant la référence au contexte de this ou Context.this à getapplicationcontext.

0
kenyan_ian
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);
}

});
0
Pascal Chidi
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);
  }

});
0
Arjun Atlast