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

27
demandé sur Agustín 2014-01-23 02:26:29

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);
}
55
répondu Lena Bru 2016-11-07 10:12:48

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

5
répondu danny117 2014-01-22 23:12:23

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 .

4
répondu nKn 2014-01-22 22:33:33

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")
4
répondu mohammed momn 2016-08-16 12:45:43
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
répondu Munna Sharma 2016-09-06 12:49:22
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
répondu Arjun Atlast 2015-07-11 04:12:28

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)
0
répondu ceph3us 2015-07-11 05:06:19

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

0
répondu kenyan_ian 2015-10-06 21:48:03
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
répondu Pascal Chidi 2017-04-28 22:58:50