click event vom customArrayAdapter

  • Antworten:14
  • Bentwortet
Johannes
  • Forum-Beiträge: 49

01.11.2011, 21:22:39 via Website

hallo,
ich habe mir meinen eigenen customArrayAdapter erstellt und will jetzt wenn man auf ein Item klickt das event abfangen und implementieren...
ich habs mal so probiert:

public class CustomArrayAdapter extends ArrayAdapter<Model> {

private final List<Model> list;
private final Activity context;

public CustomArrayAdapter(Activity context, List<Model> list) {
super(context, R.layout.list_item, list);
this.context = context;
this.list = list;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null)
{
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.list_item, null);
}

TextView tvAnzahl = (TextView) view.findViewById(R.id.lvAnzahl);
//TextView tvEinheit = (TextView) view.findViewById(R.id.lvEinheit);
TextView tvBeschreibung = (TextView) view.findViewById(R.id.lvBeschreibung);
TextView tvPreis = (TextView) view.findViewById(R.id.lvPreis);
//TextView tvWaehrung = (TextView) view.findViewById(R.id.lvWaehrung);
CheckBox checkbox = (CheckBox) view.findViewById(R.id.lvCheckBox);

Model mo = list.get(position);

tvAnzahl.setText(mo.anzahl + " " + mo.einheit);
tvBeschreibung.setText(mo.beschreibung);
tvPreis.setText(mo.preis + mo.waehrung);
checkbox.setChecked(mo.selected);

view.setClickable(true);
view.setFocusable(true);
view.setOnClickListener(myClickListener);

return view;
}

public OnClickListener myClickListener = new OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(getContext(), "click listview", 100);
}
};

}

aber irgendwie passiert da gar nix.... :(

könnte mir da jemand weiterhelfen? wäre echt super! :)

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

01.11.2011, 21:35:59 via App

Hehe,
da fehlt ein .show(), wenn ich mich nicht irre :P
Lg Ansgar

Antworten
Johannes
  • Forum-Beiträge: 49

01.11.2011, 22:03:42 via Website

verdammt du hast recht, und jetzt gehts auch ^^

vielen dank!

ok gleich das nächste Problem:
dieser toast war ja nur zu testzwecken, eigentlich wollte ich dort einen dialog öffnen... wenn ich das allerdings wie in nem anderen codeabschnitt mache : showDialog(actAdmin.DIALOG_PROPS_ID); dann erkennt der die methode showDialog nicht... ist das weil die arrayadapter classe keine activity ist? wie löse ich das denn dann?

PS: ist das clickevent dass ich da implementiert habe, das itemclick event oder nur für das ganze listview dann?

— geändert am 01.11.2011, 22:04:49

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

01.11.2011, 22:37:19 via App

Hm,
das sollte über DeineActivity.this.showDialog gehen :)
Lg Ansgar
edit : Oh, das geht nicht, hab vergessen, dass du nicht in der Activity sondern im Adapter bist..

— geändert am 01.11.2011, 22:39:05

Antworten
Johannes
  • Forum-Beiträge: 49

01.11.2011, 23:57:59 via Website

ja genau... bin da im adapter drin... aber das muss doch irgendwie gehen oder??

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

02.11.2011, 07:26:28 via App

Naja, das einfachste und typische wäre ein OnItemClickListener in der Activity. Sonst vielleicht den Dialog im Adapter erzeugen und dann anzeigen?
Lg Ansgar

Antworten
Johannes
  • Forum-Beiträge: 49

02.11.2011, 12:07:04 via Website

Ansgar M
Naja, das einfachste und typische wäre ein OnItemClickListener in der Activity. Sonst vielleicht den Dialog im Adapter erzeugen und dann anzeigen?
Lg Ansgar

das hab ich jetzt so probiert:

im oncreate von der activity:
listview.setOnItemClickListener(myItemClickListener);

und danach:
public OnItemClickListener myItemClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int i, long l) {
showDialog(DIALOG_PROPS_ID);
}
};

aber da passiert dann gar nix :(





Harald Wilhelm
Übergib doch den Context der Activity im Konstruktor an den Adapter.

ich habe den context schon übergeben, doch ich kann diese membervariable in meinem OnClickListener nicht nutzen... auch wenn ich es public mache... ka warum :(

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

02.11.2011, 15:54:14 via App

Naja, du musst ihn erst erstellen und dann setzen :) Oder seh ich das falsch? (Du schreibst "Und danach")
Lg Ansgar

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

02.11.2011, 16:27:40 via Website

Hmm,

* Context ist eine private Variable in Deinem Adapter - sehe ich nicht in Deinem Code.

* Dieser Context wird im Konstruktor des Adapters gesetzt - sehe ich.

* Dein onClickListener ist eine private Klasse in Deinem Adapter?

Dann hat der Listener Zugriff auf context. Du musst dann getContext() durch context ersetzen. view.getContext() müsste aber auch gehen.

1public OnClickListener myClickListener = new OnClickListener()
2 {
3 public void onClick(View v)
4 {
5 Toast.makeText(context, "click listview", 100);
6 }
7 };

Antworten
Johannes
  • Forum-Beiträge: 49

02.11.2011, 20:24:11 via Website

Ansgar M
Naja, du musst ihn erst erstellen und dann setzen :) Oder seh ich das falsch? (Du schreibst "Und danach")
Lg Ansgar

mit danach meine ich innerhalb der activity aber außerhalb der oncreate methode... also müsste ich es ja richtig gemacht haben oder? aber der tut gar nix :(



Harald Wilhelm
Hmm,

* Context ist eine private Variable in Deinem Adapter - sehe ich nicht in Deinem Code.
* Dieser Context wird im Konstruktor des Adapters gesetzt - sehe ich.
* Dein onClickListener ist eine private Klasse in Deinem Adapter?

Dann hat der Listener Zugriff auf context. Du musst dann getContext() durch context ersetzen. view.getContext() müsste aber auch gehen.

1public OnClickListener myClickListener = new OnClickListener()
2 {
3 public void onClick(View v)
4 {
5 Toast.makeText(context, "click listview", 100);
6 }
7 };

ha funktioniert!! super danke! weißt du jetzt noch zufällig wie ich mitbekomme um welches item es sich handelt das angeklickt wurde?

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

02.11.2011, 23:07:05 via Website

Noch eine Gegenfrage: Das ist doch eine ListActivity, oder? Und Du setzt den onClickListener auf das ganze Layout (die "inflatete" View)? Dann kannst Du den Listener ganz weglassen und in der Activity auf den onListItemSelected reagieren.

Den onClickListener benötigst Du nur dann im Adapter wenn einzelne Elemente der Zeile unterschiedlich auf einen Click reagieren. Zum Beispiel wenn in dem Row-Layout noch Buttons wären und das Anklicken der Zeile etwas anderes bewirkten soll als das Anklicken des Buttons in der selben Zeile.

— geändert am 02.11.2011, 23:08:00

Antworten
Johannes
  • Forum-Beiträge: 49

03.11.2011, 00:33:04 via Website

Harald Wilhelm
Noch eine Gegenfrage: Das ist doch eine ListActivity, oder? Und Du setzt den onClickListener auf das ganze Layout (die "inflatete" View)? Dann kannst Du den Listener ganz weglassen und in der Activity auf den onListItemSelected reagieren.

Den onClickListener benötigst Du nur dann im Adapter wenn einzelne Elemente der Zeile unterschiedlich auf einen Click reagieren. Zum Beispiel wenn in dem Row-Layout noch Buttons wären und das Anklicken der Zeile etwas anderes bewirkten soll als das Anklicken des Buttons in der selben Zeile.

ist eine ganz normale activity wo ein listview mit drin ist... innerhalb der zeile sind nur textviews und eine checkbox, also der dialog sollte nur geöffnet werden wenn auf eins der textviews geklickt wird!

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

03.11.2011, 08:13:08 via Website

Ach so, na dann geht das so nicht. Du müsstest den onClickListener instanzieren und im Konstruktor irgendein Erkennungsmerkmal mitgeben. Ein Beispiel in dem ich davon ausgehe das Dein Modell eine id hat:

1view.setOnClickListener(new MyOnClickListener(context, mo.id));
2
3// Inner Class im Adapter
4 private class MyOnClickListener implements OnClickListener {
5
6 private Context context;
7 private long id;
8
9 public MyOnClickListener(final Context context, final long id) {
10 super();
11
12 this.context = context;
13 this.id = id;
14 }
15
16 public void onClick(final View view) {
17 if (id > 0) {
18 // ...
19 }
20 }
21 }

Antworten
Johannes
  • Forum-Beiträge: 49

09.11.2011, 21:58:08 via Website

perfekt geht!!! vielen dank!

Antworten