Android ListView con elementos onClick

Soy un nuevo programador y nuevo en Android. Estoy usando este ejemplo http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/ y funciona muy bien.

Ahora quiero hacer que los elementos (Dell, Samsung Galaxy S3, etc) para llamar a una función para abrir una nueva actividad con información diferente cada uno.

Por ejemplo:

Si toco Dell, una nueva actividad debe mostrarme información sobre Dell. Si toco a Samsung, lo mismo.

I Googled pero no podía encontrar nada útil, cualquier pista? Creo que esto es básico, pero soy nuevo, así que realmente no sé por dónde empezar

En su actividad, donde definió su lista

usted escribe

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

En el adaptador getItem que escribe

 public ItemClicked getItem(int position){ return items.get(position); } 

Inicia nuevas actividades con intenciones. Un método para enviar datos a una intención es pasar una clase que implementa parcelable en la intención. Tome nota que está pasando una copia de la clase.

http://developer.android.com/reference/android/os/Parcelable.html

Aquí tengo un onItemClick. Creo la intención y ponerExtra una clase entera en la intención. La clase que estoy enviando ha implementado parcelable. Sugerencia: Sólo es necesario implementar el parseable sobre lo que es mínimamente necesario para volver a crear la clase. Es decir, un nombre de archivo o algo similar a una cadena, algo que un constructor puede usar para crear la clase. La nueva actividad puede obtener getExtras más tarde y es esencialmente crear una copia de la clase con su método constructor.

Aquí lanzo la clase kmlreader de mi aplicación cuando recibo un onclick en el listview.

Nota: debajo de resumen es una lista de la clase que estoy pasando así get (position) devuelve la clase infact es la misma lista que puebla el 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); } 

Más tarde en la nueva actividad sacar la clase parseable con

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

Buena suerte Danny117

Definitivamente debe extender ArrayListAdapter e implementar esto en su método getView() . El segundo parámetro (una View ) debe ser inflado si su valor es null , aprovecharlo y ponerlo un onClickListener() justo después de inflar.

Suponiendo que se llama su segundo getView() se llama 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 quieres información sobre cómo extender ArrayListAdapter , te recomiendo este enlace .

Bien en su onitemClick usted enviará el valor seleccionado como deal , y enviarlo en su intención al abrir una nueva actividad y en su nueva actividad obtener los datos enviados y relacionados con el elemento seleccionado mostrará sus datos

Para obtener el nombre de la list

 String item = yourData.get(position).getName(); 

Establecer los datos en la intención

 intent.putExtra("Key", item); 

Para obtener los datos en la segunda actividad

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

Para qué tipo de Infierno implementando Parcelable?

Él está pasando a la cadena del adaptador [] así que

  • Get item (String) en la posición
  • Crear intención
  • Ponerlo como extra
  • Iniciar actividad
  • En actividad obtener extra

Para almacenar la lista de productos que puede utilizar aquí HashMap (por ejemplo como objeto STATIC)

Clase de ejemplo que describe el producto:

 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); 

Entonces u pasar a conjunto de adaptador de teclas como:

 String[] productNames = _hashMap.keySet().toArray(new String[_hashMap.size()]); 

Cuando en el adaptador u retorno ver u set oyente como este, por ejemplo:

  @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); } } 

Entonces en otra actividad:

 @Override public void onCreate(Bundle) { String productName = getIntent().getExtra(key_to_product_name); Product product = _hashMap.get(productName); } 

* Key_to_product_name es una String pública static para servir como clave para extra

PD. Lo siento por typo estaba en prisa 🙂 ps2. Esto te daría una idea de cómo hacerlo ps3. Cuando voy a tener más tiempo voy a añadir una descripción detallada

MI COMENTARIO:

  • NO UTILICE NINGUNA DECLARACIÓN DEL INTERRUPTOR
  • NO CREAR ACTIVIDADES SEPARADAS PARA CADA PRODUCTO (U SOLO UNO)

Pude ir alrededor de la cosa entera substituyendo la referencia del contexto de this o Context.this a 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); } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.