Frage Android ListView mit onClick-Elementen


Ich bin ein neuer Programmierer und neu in Android. Ich benutze dieses Beispiel http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/ und es funktioniert großartig.

Jetzt möchte ich mit den Items (Dell, Samsung Galaxy S3, etc) eine Funktion zum Öffnen einer neuen Aktivität mit jeweils unterschiedlichen Informationen aufrufen.

Beispielsweise:

Wenn ich auf Dell stoße, muss eine neue Aktivität angezeigt werden, die Informationen zu Dell enthält. Wenn ich Samsung berühre, dasselbe.

Ich habe gegoogelt aber konnte nichts hilfreiches finden, keinen Hinweis? Ich denke, das ist einfach, aber ich bin neu, also weiß ich nicht wirklich, wo ich anfangen soll


27
2018-01-22 22:26


Ursprung


Antworten:


In Ihrer Aktivität, wo Sie Ihre Listview definiert haben

du schreibst

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

In das getItem Ihres Adapters schreiben Sie

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

53
2018-01-22 22:40



Sie starten neue Aktivitäten mit Absichten. Eine Methode zum Senden von Daten an eine Absicht besteht darin, eine Klasse zu übergeben, die in der Absicht parzellierbar implementiert. Beachten Sie, dass Sie eine Kopie der Klasse übergeben.

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

Hier habe ich ein onItemClick. Ich erschaffe Absicht und setzeExtra eine ganze Klasse in die Absicht. Die Klasse, die ich sende, ist parzellierbar implementiert. Tipp: Sie müssen das Parseable nur über das implementieren, was zum erneuten Erstellen der Klasse erforderlich ist. Dh vielleicht ein Dateiname oder etwas Einfaches wie eine Zeichenkette, mit der ein Konstruktor die Klasse erstellen kann. Die neue Aktivität kann späterExtras erhalten und erstellt im Wesentlichen eine Kopie der Klasse mit ihrer Konstruktormethode.

Hier starte ich die kmlreader Klasse von meine App wenn ich einen onclick in der Listenansicht erhalte.

Hinweis: Unter Zusammenfassung befindet sich eine Liste der Klassen, die ich übergebe, sodass get (position) die Klasse zurückgibt. Es handelt sich um die gleiche Liste, die die Liste füllt

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

später in der neuen Aktivität ziehe ich die Parsec Klasse mit heraus

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

Viel Glück Danny117


5
2018-01-22 23:12



Du solltest dich definitiv erweitern ArrayListAdapter und implementiere das in deinem getView() Methode. Der zweite Parameter (a View) sollte aufgeblasen werden, wenn es Wert ist nullNutze es und setze es ein onClickListener() kurz nach dem Aufblasen.

Auflegen heißt es deine Sekunde getView()Der Parameter wird aufgerufen 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 (...) {
      ...
    }
  }
}

Wenn Sie Informationen zur Erweiterung wünschen ArrayListAdapterIch empfehle das Verknüpfung.


4
2018-01-22 22:33



gut in deinem onitemClick Sie werden den ausgewählten Wert wie senden deal  und senden Sie es in Ihrer Absicht beim Öffnen neuer Aktivität und in Ihrer neuen Aktivität erhalten Sie die gesendeten Daten und bezogen auf ausgewählte Artikel werden Ihre Daten angezeigt

um den Namen von der zu bekommen list

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

Daten in Absicht setzen

intent.putExtra("Key", item);

um die Daten in der zweiten Aktivität zu erhalten

getIntent().getExtras().getString("Key")

4
2018-01-22 22:34



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
2017-09-06 12:30



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
2017-07-11 04:12



Für welche Art von Hölle, die Parcelable implementiert? 

er übergibt so an adapter String []

  • Erhalte Item (String) an der Position
  • Absicht erstellen
  • setze es als extra
  • Aktivität starten
  • in Aktivität bekommen extra

Um die Produktliste zu speichern, können Sie hier HashMap verwenden (zum Beispiel als STATIC-Objekt)

Beispielklasse, die das Produkt beschreibt:

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

dann gehen Sie zu Adapter-Schlüsselset wie folgt:

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

Wenn Sie im Adapter die Ansicht zurückgeben, setzen Sie den Listener zum Beispiel wie folgt:

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

dann in anderer Aktivität:

@Override 
public void onCreate(Bundle) {

    String productName = getIntent().getExtra(key_to_product_name);
    Product product = _hashMap.get(productName);

}

* key_to_product_name ist eine öffentliche statische Zeichenfolge, die als Schlüssel für extra dient

ps. Entschuldigung für Tippfehler Ich war in Eile :) PS2. Das sollte dir eine Idee geben, wie es geht PS3. Wenn ich mehr Zeit habe, füge ich eine detaillierte Beschreibung hinzu

MEIN KOMMENTAR:

  • VERWENDEN SIE KEINE SWITCHERKLÄRUNG
  • KEINE SEPARATEN AKTIVITÄTEN FÜR JEDES PRODUKT ERSTELLEN (NUR NUR EINEN ERFORDERLICHEN)

0
2017-07-11 04:59