Eigene Parameter bei ListView übergeben (setOnItemClickListener)

  • Antworten:4
Laire
  • Forum-Beiträge: 71

06.08.2014, 15:47:41 via Website

Hallo,

wie kann ich einem Listview Item separate Parameter übergeben unter nutzung eines eigenen Adapters?

Ziel:

Ein Klick auf ein Item der Listview öffnet eine neu Activity, die dann anhand der Parameter einen bestimmten Datensatz anfordert.

Frage:

Muss ich, in diesem Beispiel Monat und Jahr, als versteckte Felder in den Custom View einbauen und dann bei setOnItemClickListener per findViewById abrufen oder kann ich den einzelnen Items auch auf eine andere Art Parameter übergeben?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.08.2014, 16:00:31 via Website

Hallo,
wie sieht denn ein Adapter bisher aus?
Also ich sehe auf anhib 2 Möglichkeiten:
1. In die View als Tag oder so übergeben (ist schlecht, wiederspricht dem MVC Prinzip und solle nicht verwendet werden)
2. Du hast ein Array mit deinen Parameten in der gleichen Raihenfloge wie die ListView Items.

Da du bei der onItemClicked der ListView die aktuelle Position mitbekommst, kannst du dann deine Parameterdaten aus dem Array per Index laden.
So hast du eine Variable (Array) in dem Alle Parameter für die neue Activity gespeichert sind.

PS: per findViewById ruft man normalerweise nur Views von XML Layout ab, wenn du das wirklich so machen solltest, dann musst du die View nehmen, die dir der ItemListener als zugriffsview zu Verfügung stellt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Laire
  • Forum-Beiträge: 71

06.08.2014, 16:19:34 via Website

Die Daten kommen aus einer Liste mit Objekten einer selbst erstellten Klasse (classRelease).
Also wäre es am günstigen in die neue Activity die Position und die Liste zu übergeben und dann dort den Eintrag rauszusuchen?

Also der Adapter sieht so aus:

public class pointsAdapter extends ArrayAdapter<classRelease> {

    private Context context;
    private List<classRelease> releases;

    public pointsAdapter(Context context, List<classRelease> releases) {
        super(context, R.layout.row_points, releases);
        this.context = context;
        this.releases = releases;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.row_points, parent, false);

        ImageView icon = (ImageView) row.findViewById(R.id.icon);
        TextView release = (TextView) row.findViewById(R.id.release);
        TextView titel = (TextView) row.findViewById(R.id.titel);
        TextView result = (TextView) row.findViewById(R.id.result);

        int resultInt = releases.get(position).getResult();

        release.setText(releases.get(position).getRelease());
        titel.setText(releases.get(position).getTitle());
        String answers = releases.get(position).getCorrectAnswered();

        if(resultInt == 0) {
            icon.setImageResource(R.drawable.not);
            result.setText("Nicht teilgenommen");
        }else if(resultInt == 1){
            icon.setImageResource(R.drawable.fail);
            result.setText("Nicht bestanden: " + answers + "% richtig beantwortet");
        }else if (resultInt == 2){
            icon.setImageResource(R.drawable.passed);
            result.setText("Bestanden: " + answers + "% richtig beantwortet");
        }

        return row;
    }
}

Die Row sieht so aus:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:padding="6dip">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="6dip"
        android:contentDescription="Symbol"
        android:src="@drawable/not"
        android:gravity="center_vertical"/>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical">

        <TextView
            android:id="@+id/release"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Example application"
            android:textSize="16sp"
            android:ellipsize="end"
            android:lines="1"
        />

        <TextView
            android:id="@+id/titel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Example application"
            android:textSize="16sp"
            android:ellipsize="end"
            android:lines="1"
            />

        <TextView
            android:id="@+id/result"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="Description"
            android:textSize="12sp" />
    </LinearLayout>
</LinearLayout>

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.08.2014, 16:43:48 via Website

Also wenn du ein Array von Objekten hast, dann ist es am einfachsten im click Listener die Zugehörigen Parameter per Index aus dem Array zu lesen.
Sonst würde auch eine ArrayList oder HashMap mit der Zuordung id<>Parameter funktionieren.

— geändert am 06.08.2014, 16:43:56

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Laire
  • Forum-Beiträge: 71

06.08.2014, 16:48:48 via Website

Ok den Wald vor lauter Bäumen wieder nicht gesehen. Natürlich kann ich im Listener auf den Array zugreifen, der die Listview füllt und dann die benötigten Informationen übergeben.

Vielen Dank für den Denkanstoß....

Gruß

Antworten