# Android Studio  - ArrayList - Selected Item ermitteln



## Joob (8. Aug 2019)

Ich habe eine Arraylist mit Objekten .

Leider finde ich keine Möglichkeit, entweder die Klasse oder die Pos(index) des gerade gewählten Items zu ermitteln.

Hat jemand eine Idee wie man das anstellen muss.




```
package com.job.vt;

import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.textfield.TextInputLayout;

import java.util.ArrayList;

public class A1000_VokTestRCAdapter extends RecyclerView.Adapter<A1000_VokTestRCAdapter.rc_a1000_rcviewholder> {

    private ArrayList<A1000_VokTestDataClass> voktestdata;

    public  class rc_a1000_rcviewholder extends RecyclerView.ViewHolder{

        public TextView baselanguage;
        public TextView word;
        public TextInputLayout usersinput;
        public EditText usersimput_edittext;
        public ImageButton showword;
        public ImageButton playsound;


        public rc_a1000_rcviewholder(@NonNull final View itemView) {

            super ( itemView );

            word = itemView.findViewById ( R.id.a1000_word );
            baselanguage = itemView.findViewById ( R.id.a1000_baselanguage );
            usersinput = itemView.findViewById ( R.id.a1000_usersinput );
            usersimput_edittext = itemView.findViewById ( R.id.a1000_usersinput_edittxt );


            showword = itemView.findViewById ( R.id.a1000_showword );
            playsound = itemView.findViewById ( R.id.a1000_playsound );

            usersimput_edittext.setOnFocusChangeListener(new View.OnFocusChangeListener () {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {

//                         Aber wie komme ich an die Position
//                        A1000_VokTestDataClass currentdata =  voktestdata.get(position);

                        Log.d ( "voktest" , "jetzt würde ich speichern : " + usersimput_edittext.getText ( ) + "index : "  );


                    }
                }
            });

            showword.setOnClickListener ( new View.OnClickListener ( ) {
                @Override
                public void onClick(View view) {
                    Log.d ("voktest", "Show was clicked !");
                }
            } );


            playsound.setOnClickListener ( new View.OnClickListener ( ) {
                @Override
                public void onClick(View view) {
                    Log.d ("voktest", "Sound was clicked !");
                }
            } );
        }
    }




    public A1000_VokTestRCAdapter(ArrayList<A1000_VokTestDataClass> testdatafromdb) {
        voktestdata = testdatafromdb;
    }

    @NonNull
    @Override
    public rc_a1000_rcviewholder onCreateViewHolder(@NonNull ViewGroup parent , int viewType) {

        View v = LayoutInflater.from(parent.getContext ()).inflate ( R.layout.activity_a1000_voktest_recyclerview, parent,false );
        rc_a1000_rcviewholder vh = new rc_a1000_rcviewholder ( v );
        return vh;

    }


    @Override
    public void onBindViewHolder(@NonNull rc_a1000_rcviewholder holder , int position) {

        A1000_VokTestDataClass currentdata = voktestdata.get(position);

        holder.baselanguage.setText (currentdata.getBaselanguage ());
        holder.word.setText ( currentdata.getWord () );

    }


    @Override
    public int getItemCount() {

        return voktestdata.size ();
    }



    private void SafeUsersInput (String strusersinput) {


//        A1000_VokTestDataClass currentdata = voktestdata

//        currentdata.setUsersinput ( strusersinput );
    }
}
```


----------



## mihe7 (8. Aug 2019)

Joob hat gesagt.:


> Leider finde ich keine Möglichkeit, entweder die Klasse oder die Pos(index) des gerade gewählten Items zu ermitteln.


Bei _den_ Bezeichnern wundert mich das nicht   SCNR

Ansonsten: https://stackoverflow.com/questions/28296708/get-clicked-item-and-its-position-in-recyclerview


----------



## Joob (8. Aug 2019)

Ich habe die Bezeichner so gewählt um besser von anderen Activities abzugrenzen.

Leider ist dein Beispiel bezogen auf onClick
ich müsste aber onSelected verwenden.

Habe das auch schon versucht, mit einem Interface, allerdings wird mir das onItemSelected nicht im Contructor angeboten, nur das onClick, aber damit kann ich nichts tun da der User nicht zwingend auf die Card klicken muss.

Ich versuch mich daran zu arbeiten indem ich die Videos von coding on flow nachvollziehe und dabei entsprechend umbaue.

https://codinginflow.com/tutorials/android/recyclerview-cardview/part-4-onitemclicklistener


----------



## mihe7 (8. Aug 2019)

Joob hat gesagt.:


> Leider ist dein Beispiel bezogen auf onClick


Eigentlich ist Dein Code auf onClick bezogen... Was ist onSelected?


----------



## Javinner (8. Aug 2019)

Joob hat gesagt.:


> Ich habe eine Arraylist mit Objekten .
> Leider finde ich keine Möglichkeit, entweder die Klasse oder die Pos(index) des gerade gewählten Items zu ermitteln.


Wie wäre es, wenn man eine Variable `aktuellerItem` einführen würde?


----------



## Joob (8. Aug 2019)

Was meinst du mit aktuellerItem ?


Ich habe eine Lösung die auch hinsichtlich der Datenklasse funktioniert, allerdings verschieben sich die Eingaben in den Eingabefeldern.

Hier erst mal meine Lösung :

```
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.textfield.TextInputLayout;

import java.util.ArrayList;

public class A1000_VokTestRCAdapter extends RecyclerView.Adapter<A1000_VokTestRCAdapter.rc_a1000_rcviewholder> {

    private ArrayList<A1000_VokTestDataClass> voktestdata;


    public static  class rc_a1000_rcviewholder extends RecyclerView.ViewHolder{

        public TextView baselanguage;
        public TextView word;
        public TextInputLayout usersinput;
        public EditText usersimput_edittext;
        public ImageButton showword;
        public ImageButton playsound;
        public RecyclerView rc;


        public   rc_a1000_rcviewholder(@NonNull final View itemView, final ArrayList<A1000_VokTestDataClass> voktestdata) {


            super ( itemView );

            rc = itemView.findViewById ( R.id.a1000_rv_testvoks );

            word = itemView.findViewById ( R.id.a1000_word );
            baselanguage = itemView.findViewById ( R.id.a1000_baselanguage );
            usersinput = itemView.findViewById ( R.id.a1000_usersinput );
            usersimput_edittext = itemView.findViewById ( R.id.a1000_usersinput_edittxt );


            showword = itemView.findViewById ( R.id.a1000_showword );
            playsound = itemView.findViewById ( R.id.a1000_playsound );



            usersimput_edittext.setOnFocusChangeListener(new View.OnFocusChangeListener () {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus) {

                         int position = getAdapterPosition ();
                        A1000_VokTestDataClass currentdata =  voktestdata.get(position);
                        currentdata.setUsersinput ( usersimput_edittext.getText ( ).toString () );

                        Log.d ( "voktest" , "jetzt würde ich speichern : " + usersimput_edittext.getText ( ) + "index : " + position );

                    }
                }
            });

            showword.setOnClickListener ( new View.OnClickListener ( ) {
                @Override
                public void onClick(View view) {
                    Log.d ("voktest", "Show was clicked !");
                }
            } );


            playsound.setOnClickListener ( new View.OnClickListener ( ) {
                @Override
                public void onClick(View view) {
                    Log.d ("voktest", "Sound was clicked !");
                }
            } );
        }


    }




    public A1000_VokTestRCAdapter(ArrayList<A1000_VokTestDataClass> testdatafromdb) {
        voktestdata = testdatafromdb;
    }

    @NonNull
    @Override
    public rc_a1000_rcviewholder onCreateViewHolder(@NonNull ViewGroup parent , int viewType) {

        View v = LayoutInflater.from(parent.getContext ()).inflate ( R.layout.activity_a1000_voktest_recyclerview, parent,false );
        rc_a1000_rcviewholder vh = new rc_a1000_rcviewholder ( v,  voktestdata );
        return vh;

    }


    @Override
    public void onBindViewHolder(@NonNull rc_a1000_rcviewholder holder , int position) {

        A1000_VokTestDataClass currentdata = voktestdata.get(position);

        holder.baselanguage.setText (currentdata.getBaselanguage ());
        holder.word.setText ( currentdata.getWord () );

    }


    @Override
    public int getItemCount() {

        return voktestdata.size ();
    }



    private void SafeUsersInput (String strusersinput) {


//        A1000_VokTestDataClass currentdata = voktestdata

//        currentdata.setUsersinput ( strusersinput );
    }
}
```


Dann habe ich die Daten ja bei der Eingabe protokoliert, da sieht auch alles gut aus.
Der zweite Bereich gibt die Datenklasse nach Eingabe aus. (Achtung habe das Leerzeichen vor index vergessen.)

2019-08-08 20:43:19.175 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : index : 0
2019-08-08 20:49:20.001 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 1 alleindex : 0
2019-08-08 20:49:29.939 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 2 assianindex : 1
2019-08-08 20:49:31.229 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 2 assianindex : 1
2019-08-08 20:49:50.060 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 3 welkommindex : 2
2019-08-08 20:49:59.971 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 4 Bootindex : 3
2019-08-08 20:50:11.600 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 5 aligatorindex : 4
2019-08-08 20:50:39.812 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 6 coupeindex : 5
2019-08-08 20:51:02.366 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 7 bitteindex : 6
2019-08-08 20:51:15.629 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 8 33index : 7
2019-08-08 20:51:31.709 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 9 test 3index : 8
2019-08-08 20:51:32.815 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 9 test 3index : 8
2019-08-08 20:51:55.237 5527-5527/com.job.vt D/voktest: jetzt würde ich speichern : 10 33index : 9

Datenklasse ausgegeben
2019-08-08 20:52:20.905 5527-5527/com.job.vt D/voktest: Baselanguage : alle  /  usersinput : 1 alle
2019-08-08 20:52:20.905 5527-5527/com.job.vt D/voktest: Baselanguage : asiante  /  usersinput : 2 assian
2019-08-08 20:52:20.906 5527-5527/com.job.vt D/voktest: Baselanguage : Willkommen  /  usersinput : 3 welkomm
2019-08-08 20:52:20.907 5527-5527/com.job.vt D/voktest: Baselanguage : Boot  /  usersinput : 4 Boot
2019-08-08 20:52:20.907 5527-5527/com.job.vt D/voktest: Baselanguage : alligator  /  usersinput : 5 aligator
2019-08-08 20:52:20.907 5527-5527/com.job.vt D/voktest: Baselanguage : coupe  /  usersinput : 6 coupe
2019-08-08 20:52:20.907 5527-5527/com.job.vt D/voktest: Baselanguage : Bitte  /  usersinput : 7 bitte
2019-08-08 20:52:20.907 5527-5527/com.job.vt D/voktest: Baselanguage : 33  /  usersinput : 8 33
2019-08-08 20:52:20.907 5527-5527/com.job.vt D/voktest: Baselanguage : 3ter test  /  usersinput : 9 test 3
2019-08-08 20:52:20.907 5527-5527/com.job.vt D/voktest: Baselanguage : 33  /  usersinput : 10 33


In der Anzeige erscheint dann aber plötzlich so etwas:

für die Lesbarkeit, oben sieht man das unter alle auch alle gespeichert wurde, (sieht man im Codebeispiel)
und in beim auslesen der Datenklasse ist das auch genau dort gespeichert.
Gibt es da etwas zu berücksichtigen wenn man TextInputLayout in den Cards verwendet ?


----------



## Joob (8. Aug 2019)

Ach ja, das geht nur wenn die Liste nicht erweitert oder verkleinert oder sortiert wird. 
Das ist bei mir gerade der Fall, aber richtig wäre es den Verweis auf das Objekts aus der Auswahl zu lesen.


----------



## Javinner (9. Aug 2019)

Joob hat gesagt.:


> Was meinst du mit aktuellerItem ?


Wenn ein Item ausgewählt wird, wird dieser als der aktuelleItem, gespeichert. So kannst du diese Variable stets abrufen.


----------



## Joob (9. Aug 2019)

Aber wie, oder wo kann ich mir das anschauen, mit rumprobieren kann das lange dauern.
Hast du vielleicht eine Link ?


----------



## Joob (9. Aug 2019)

Und was meinst du zu dem Darstellungsproblem ?


----------



## Javinner (9. Aug 2019)

```
public class GameObject
{

    private Itemable currentItem;

    private final List<Itemable> itemList;

    public GameObject()
    {
        this.itemList = new ArrayList<>();
    }

    public void addToList(Itemable item)
    {
        this.itemList.add(item);
        this.currentItem = item;
    }

    public String getCurrentItemName()
    {
        return this.currentItem.getName();
    }

}

public class ItemDemo
{

  
    public static void main(String[] args)
    {
        GameObject object = new GameObject();
        
        object.addToList(new Knife());
        System.out.println(object.getCurrentItemName());
        
        object.addToList(new Glasses());
        System.out.println(object.getCurrentItemName());
        
        object.addToList(new Telescope());
        System.out.println(object.getCurrentItemName());
    }
    
}

/** Output */
Knife
Glasses
Telescope
```


----------



## Joob (9. Aug 2019)

Danke, 
habs gerade noch gelesen, 
bin aber jetzt die nächsten Tage schwer beschäftigt.
Melde mich in ein paar Tagen noch mal.


----------



## Joob (21. Aug 2019)

Hallo ,

hinsichtlich des Darstellungsproblems :

Der Inhalt der Textfelder wird nach dem scrollen durcheinandergewürfelt.
Wenn du das Protokoll ansiehst, erkennst du das alles korrekt in der Klasse gespeichert ist.

Auf den Screenshots, siehst du die Anzeige nach dem Scrollen.


----------



## Joob (21. Aug 2019)

Habe die Ursache gefunde, hatte etwas im Adapter vergessen.
Schönen Dank für euere Hilfe.


----------

