Custom ListView selektierbar machen

  • Antworten:3
Timo Weck
  • Forum-Beiträge: 5

01.02.2017, 15:13:26 via Website

Hallo miteinander!
Ich bin neu im Forum und habe direkt mal eine Frage!

Ich habe eine ListView mit einem selbst geschriebenen ArrayAdapter und möchte nun, dass die ListenElemente selektierbar sind. Mittels listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); kommt kein Ergebnis.

Hier mein ArrayAdapter:

public class ArrayAdapterAktivitaeten extends ArrayAdapter<Aktivitaet> {

private Context context;
private List<Aktivitaet> aktivitaeten;

public ArrayAdapterAktivitaeten(Context context, List<Aktivitaet> aktivitaeten) {
    super(context, R.layout.list_aktivitaeten, aktivitaeten);
    this.context = context;
    this.aktivitaeten = aktivitaeten;
}

@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.list_aktivitaeten, parent, false);

    TextView uhrzeit = (TextView) row.findViewById(R.id.tv_uhrzeit);
    TextView geplanteAktivitaet = (TextView) row.findViewById(R.id.tv_geplante_aktivitaet);
    TextView tatsaechlicheAktivitaet = (TextView) row.findViewById(R.id.tv_tatsaechliche_aktivitaet);

    String uhrzeitText = null;
    try {
        uhrzeitText = new SimpleDateFormat("HH:mm").format(new SimpleDateFormat("HH-mm").parse(aktivitaeten.get(position).getUhrzeit()));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    uhrzeit.setText(uhrzeitText);
    geplanteAktivitaet.setText(aktivitaeten.get(position).getGeplanteAktivitaet());
    tatsaechlicheAktivitaet.setText(aktivitaeten.get(position).getTatsaechlicheAktivitaet());

    Spinner spinner = (Spinner) row.findViewById(R.id.sp_bewertung);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(parent.getContext(), R.array.spinnerBewertung, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    AktivitaetDataSource dataSource = AktivitaetDataSource.getDataSource(parent.getContext());
    spinner.setSelection(dataSource.getBewertung((aktivitaeten.get(position).getId())));
    final int position1 = position;
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            aktivitaeten.get(position1).setBewertung(pos);
            AktivitaetDataSource dataSource = AktivitaetDataSource.getDataSource(parent.getContext());
pos="+pos);
            dataSource.updateBewertung(aktivitaeten.get(position1).getId(), pos);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent){

        }
    });

    return row;
}

}

UND ein Auszug aus MainActivity. java:

private void zeigeDatenAn(){

    Log.d(LOG_TAG, "vor getActivitaeten()");
    dataSource.open();
    aktivitaeten = dataSource.getAktivitaeten(Calendar.getInstance());

    Log.d(LOG_TAG, "vor ListView finden");
    ListView listView = (ListView) findViewById(R.id.list_aktivitaeten);

    listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            view.getFocusables(position);
            view.setSelected(true);
        }
    });

    Log.d(LOG_TAG, "Adapter fertig machen");
    ArrayAdapterAktivitaeten adapter = new ArrayAdapterAktivitaeten(this, aktivitaeten);

    listView.setAdapter(adapter);
    Log.d(LOG_TAG, "Adapter gesetzt");

}

Und die ListAktivitaeten .xml

<?xml version="1.0" encoding="utf-8"?>

xmlns:android="http:/ /schemas. android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_height="wrap_content"
    android:id="@+id/tv_uhrzeit"
    android:text="00:00"
    android:layout_width="40dp" />

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="0.3">

    <TextView
        android:text="Aktivitaet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_geplante_aktivitaet"
        android:layout_weight="1" />

    <TextView
        android:text="Tatsaechliche Aktivitaet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_tatsaechliche_aktivitaet"
        android:layout_weight="1" />

</LinearLayout>

<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/sp_bewertung"
    android:layout_weight="0.7" />

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

01.02.2017, 16:42:33 via Website

Hallo Timo,
Herzlich wilkommen hier im Forum :)



Wie sieht denn dein Layout mit der ListView aus?

Was soll denn beim Klick passieren? - soll das selektierte farbig hervorgehoben werden? Wenn ja dann musst du das in der XML definieren

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

Antworten
Timo Weck
  • Forum-Beiträge: 5

01.02.2017, 17:39:03 via Website

Hallo Pascal!

Entschuldige bitte meine undurchsichtige Ausführung eben. Also nochmal in aller Ausführlichkeit:
Ich habe eine Activity, die u.a. eine ListView beinhaltet. Diese ListView wird gefüllt mit einem ArrayAdapter, dessen Layout drei TextViews sowie einen Spinner beinhaltet.
Nun will ich erreichen, dass die ListView durch Antippen des Listenelements farbig hervorgehoben wird und ich mittels listView.getSelectedItemId() die Position des Selektierten Listenelements abfragen kann. Momentan passier nichts, wenn ich auf ein Listenelement tippe.

Hier nochmal das Layout der Listenelemente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http:/ /schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_height="wrap_content"
    android:id="@+id/tv_uhrzeit"
    android:text="00:00"
    android:layout_width="40dp" />

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="0.3">

    <TextView
        android:text="Aktivitaet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_geplante_aktivitaet"
        android:layout_weight="1" />

    <TextView
        android:text="Tatsaechliche Aktivitaet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tv_tatsaechliche_aktivitaet"
        android:layout_weight="1" />

</LinearLayout>

<Spinner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/sp_bewertung"
    android:layout_weight="0.7" />

Und die ListView ist so in die Activity eingebunden:

<ListView android:id="@+id/list_aktivitaeten"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/list_bg"
        android:choiceMode="singleChoice"/>

Antworten
Timo Weck
  • Forum-Beiträge: 5

02.02.2017, 12:55:48 via Website

Hallo!
Ich habe mitlerweile die Lösung gefunden. Was fehlte, war

android:descendantFocusability="blocksDescendants"

Damit klappt es. Vielen Dank für die Bemühungen.

Antworten