# android Spinner funktioniert nicht



## Joob (28. Nov 2016)

Mein Spinner zeigt zwar die WerteListe als DropDown an aber weder werden die Werte in den Textteil geschreiben noch wird der Listener OnSelectedItem funktioniert nicht mehr.

Ich bekomme keine Fehler, und habe keine Ahnung wo ich das anfassen soll !


```
public ArrayList<A2100_spin_groups_fields> a2100_spin_groups_array = new ArrayList<A2100_spin_groups_fields>();
    A2100_spin_groups_fields_adapter spinGroupAdapter;

    TextView TFIDMember;
    EditText TFMemberName;
    CheckBox CBMemberAktiv;
    Spinner SPMemberGroup;

    String MemberID;
    String MemberName;
    String MemberAktiv;
    String MemberGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        boolean varAktiv;

        super.onCreate(savedInstanceState);
        setContentView(R.layout.a2100_member_change);

        String method = "SPI";
        A2100_member_change.BGT2100 BGT2100 = new A2100_member_change.BGT2100(this);
        BGT2100.execute(method, MemberID, MemberName, MemberAktiv, MemberGroup);

        // Resources passed to adapter to get image
        Resources res = getResources();

        TFIDMember = (TextView) findViewById(R.id.A2100_IDMember);
        TFMemberName = (EditText) findViewById(R.id.A2100_MemberName);
        CBMemberAktiv = (CheckBox) findViewById(R.id.A2100_MemberAktiv);
        SPMemberGroup = (Spinner) findViewById(R.id.A2100_MemberGroup);

        // Create custom adapter object ( see below CustomAdapter.java )
        spinGroupAdapter = new A2100_spin_groups_fields_adapter(this, R.layout.a2100_spin_groups_rowlayout, a2100_spin_groups_array,res);

        // Set adapter to spinner
        SPMemberGroup.setAdapter(spinGroupAdapter);

        String[] TagToChange = getIntent().getExtras().getString("TagToChange").split(";");

        if(TagToChange[2].equals("0")) {varAktiv = false;} else {varAktiv = true;}

        if (TagToChange[0].equals("0"))
        {
            TFIDMember.setText(null);
            TFMemberName.setText(null);
            CBMemberAktiv.setChecked(false);
            SPMemberGroup.setSelection(0);
        } else
        {
            TFIDMember.setText(TagToChange[0]);
            TFMemberName.setText(TagToChange[1]);
            CBMemberAktiv.setChecked(varAktiv);
            SPMemberGroup.setSelection(0);
        }


        // Listener called when spinner item selected
       SPMemberGroup.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parentview, View v, int position, long id) {

                // Get selected row data to show on screen
                String GroupID    = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupID)).getText().toString();
                String GroupName = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupName)).getText().toString();

                String OutputMsg = "Selected Group : \n\n"+GroupID+"\n"+GroupName;
                System.out.println("Group : " + GroupID);
                Toast.makeText(getApplicationContext(),OutputMsg, Toast.LENGTH_LONG).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parentView) {
                System.out.println("bin dada ");
            }

        });


    }
```


----------



## buggy84 (29. Nov 2016)

Ich hatte gestern ein ähnliches Problem - mit einer SeekBar. Kein Listener funktionierte. Erst nachdem ich die App von meinem Testgerät gelöscht hatte, Clean und Build erneut gemacht habe, lief es dann. Ich glaube mein Android Studio ist leicht verbuggt.
Vielleicht hilft es Dir ja weiter.


----------



## Robat (29. Nov 2016)

Joob hat gesagt.:


> @Override
> public void onItemSelected(AdapterView<?> parentview, View v, int position, long id) {
> 
> // Get selected row data to show on screen
> ...



Wenn sich die Auswahl des Spinners ändert, dann soll sich auch der Text in den beiden TextViews ändern, richtig?
Dann musst du das deinem Spinner / den TextViews auch mitteilen. 
Momentan holst du dir nur die Werte aus den TextViews (die immer gleich sind) und speicherst sie ab.

Je nach dem wie dein Item des Spinners aufgebaut ist, kannst du sowas machen:

```
parent.getItemAtPosition(pos).getText(); // o. ä. Funktionen
```


----------



## Joob (30. Nov 2016)

an Buggy

Hallo,

Clean und Build habe ich schon gemacht.`Leider kein Erfolg.
Ich würde jetzt ein neues Projekt beginnen und die Daten aus dem alten importieren. Das Manifest im aktuellen Projekt sieht auch etwas komisch aus.
Gibts beim importieren was zu beachten ?


----------



## Joob (30. Nov 2016)

an Robat

aber was sagst du dazu das er auf den Listener nicht reagiert, dort habe ich mit System.out... geprüft. Der Listener wird nicht aktiviert.
Ansonsten Danke, das baue ich noch ein.


----------



## buggy84 (30. Nov 2016)

Wie komisch sieht denn dein Manifest aus?
Wenn Du alte Daten importierst, importierst Du zwangsläufig auch alle Fehler.
Versuche mal bitte, einen weiteren Spinner zu implementieren, und füge dem auch den Listener hinzu. Prüfe, obs bei dem funktioniert.
Weterhin kannst Du ja mal andere Listener implementieren. So schnell würde ich die Flinte nicht ins Korn werfen.

Edit:
Vielleicht bin ich blind, aber müsstest Du nicht 

```
.setDropDownViewResource
```
 auf Deinen Adapter anwenden?


----------



## Joob (30. Nov 2016)

Das ist mein erstes Projekt, und ich habe da mehrfach Namen geändert dabei scheint im Manifest einiges durcheinander gekommen zu sein. Also ich hab dann heute mal alles neu gemacht, jede Activit angelegt, jede Klasse angelegt, alles per Hand angepaßt, und nun ist das was im Manifest steht auch wieder nachvollziehbar.
Hier da du gefragt hast:
Neu und gut:

```
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.traincounter.jupp.tc">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:name=".Z_GlobalVars"
        android:allowBackup="true"
        android:icon="@mipmap/yorokobi_symbol_white"
        android:label="Yorokobi Training"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".A0000_login">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".A0100_base" />
        <activity android:name=".A1000_training_groups" />
        <activity android:name=".A2000_members" />
        <activity android:name=".A2100_member_change" />
        <activity android:name=".A3000_trainers" />
        <activity android:name=".A3100_trainer_change" />
        <activity android:name=".A4000_groups" />
        <activity android:name=".A4100_group_change" />
        <activity android:name=".A5000_report"></activity>
    </application>

</manifest>
```
alt und komisch:

```
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.traincounter.yorokobi.jupp.trainyorokobi"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
  android:minSdkVersion="18"
  android:targetSdkVersion="23" />

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  <application
  android:name="com.traincounter.yorokobi.jupp.trainyorokobi.Z_GlobalVars"
  android:allowBackup="true"
  android:icon="@mipmap/yorokobi_symbol_white"
  android:label="Yorokobi Training"
  android:supportsRtl="true"
  android:theme="@style/AppTheme" >
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A0000_login" >
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  </activity>
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A1100_booking" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A2000_members" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A3000_trainers" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A4000_groups" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A5000yorokobi_report" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A0100_base" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A1000_training_groups" />
  <!--
ATTENTION: This was auto-generated to add Google Play services to your project for
  App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information.
  -->
  <meta-data
  android:name="com.google.android.gms.version"
  android:value="@integer/google_play_services_version" />

  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A2100_member_change" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A4100_group_change" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A3100_trainer_change" />
  <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A0000_spin_train_fields" />
  </application>

</manifest>
```

Allerdings liegt der Fehler in dem was Ihr sagt, das werde ich morgen Abend genau kontrollieren.


----------



## buggy84 (7. Dez 2016)

Gibts Ergebnisse, die Du mit uns teilen möchtest?


----------



## Joob (7. Dez 2016)

Ich komm da nicht weiter, 
da sind aber  noch andere Problem zu lösen, das mach ich erst mal und geh das ganze dann mit etwas Abstand neu an.
Hast Du eine Idee. Ist doch komisch das nur der Texteil nicht funktioniert. Ich habe schon Stunden daran kontroliert und im Beispiell im Internet läuft das. 
Ich habe aber eine weiteres Spinner gebaut, das gleiche. Muss also definitiv ein Fehler in meinem Code sein.


----------



## Robat (7. Dez 2016)

Poste mal bitte *alle *relevanten Codeabschnitte. 
-Also wie / wo du den Spinner initialisierst. 
- Layout Datei(en)
- (Manifest ist eher irrelevant afaik)
- deinen Adapter!

Was mich ein wenig wundert ist, dass du eine ArrayList `a2100_spin_groups_array` deklarierst aber niemals Werte setzt. Wo genau werden denn die Werte zu der ArrayList hinzugefügt?

Off-Topic
Würde dir raten mehr mit LogCat zuarbeiten anstatt mit Syso 

Gruß


----------



## buggy84 (8. Dez 2016)

pack dein Projekt mal zusammen als zip und auf DropBox, dann kann man sich die mal runterladen und ansehen.


----------



## Joob (8. Dez 2016)

Ok, ich hab es mal angefügt und gekürzt. Das Array kommt aus einem JSON das habe ich fertig eingegeben, da ich die Daten aus einer DB im Internet abfrage.
Ich muste ein paar Links mit http ... durch xyz ersetzen, die wollte er nicht mitnehmen.
Ich hoffe du hast eine IDEE.

Das Beispiel kommt aus dem Internet:
http://androidexample.com/Custom_Sp...le/index.php?view=article_discription&aid=84#

als Vid : 




package com.traincounter.jupp.tc;

import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.res.Resources; 
import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.CheckBox; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast;

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject;

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.iutputStream; 
import java.iutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.ProtocolException; 
import java.net.URL; 
import java.net.URLEncoder; 
import java.util.ArrayList;

public class A2100_member_change extends AppCompatActivity {

public ArrayList<A2100_spin_groups_fields> a2100_spin_groups_array = new ArrayList<A2100_spin_groups_fields>();
A2100_spin_groups_fields_adapter spinGroupAdapter;

TextView TFIDMember;
EditText TFMemberName;
CheckBox CBMemberAktiv;
Spinner SPMemberGroup;

String MemberID;
String MemberName;
String MemberAktiv;
String MemberGroup;

@Override
protected void onCreate(Bundle savedInstanceState) {

    boolean varAktiv;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.a2100_member_change);

    String method = "SPI";
    A2100_member_change.BGT2100 BGT2100 = new A2100_member_change.BGT2100(this);
    BGT2100.execute(method, MemberID, MemberName, MemberAktiv, MemberGroup);

    // Resources passed to adapter to get image
    Resources res = getResources();

    TFIDMember = (TextView) findViewById(R.id.A2100_IDMember);
    TFMemberName = (EditText) findViewById(R.id.A2100_MemberName);
    CBMemberAktiv = (CheckBox) findViewById(R.id.A2100_MemberAktiv);
    SPMemberGroup = (Spinner) findViewById(R.id.A2100_MemberGroup);

    // Create custom adapter object ( see below CustomAdapter.java )
    spinGroupAdapter = new A2100_spin_groups_fields_adapter(A2100_member_change.this, R.layout.a2100_spin_groups_rowlayout, a2100_spin_groups_array,res);

    // Set adapter to spinner
    SPMemberGroup.setAdapter(spinGroupAdapter);


        TFIDMember.setText(null);
        TFMemberName.setText(null);
        CBMemberAktiv.setChecked(false);
        SPMemberGroup.setSelection(0);


    SPMemberGroup.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            System.out.println("getouched");
            System.out.println("WERT : " + SPMemberGroup.getPrompt());
            return false;
        }
    });

    // Listener called when spinner item selected
    SPMemberGroup.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parentview, View v, int position, long id) {

            // Get selected row data to show on screen
            String GroupID    = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupID)).getText().toString();
            String GroupName = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupName)).getText().toString();

            String OutputMsg = "Selected Group : \n\n"+GroupID+"\n"+GroupName;
            System.out.println("Group : " + GroupID);
            Toast.makeText(getApplicationContext(),OutputMsg, Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
            System.out.println("bin dada ");
        }

    });


}

public void NewMember(View view)
{

}

public void SetMember(View view)
{

}

public void DelMember(View view)
{


}

public void delTag()
{


}






public class BGT2100 extends AsyncTask<String,String,String> {

    Context ctx;

    BGT2100(Context ctx)
    {
        this.ctx = ctx;
    }



    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params)
    {


        String returnMessage = "";

        if (method.equals("SAV"))
        {


        } else if (method.equals("SPI"))
        {
                result ="{\"allgroups\":[{\"id\":\"1\",\"trainGroup\":\"Erwachsene\"},{\"id\":\"2\",\"trainGroup\":\"Kinder\"}]}";         
                lstGroupsJsonObj = new JSONObject(result);
                lstGroupsJsonArr = lstGroupsJsonObj.getJSONArray("allgroups");

                int count = 0;
                String idGroup = "";
                String nameGroup = "";

                while(count < lstGroupsJsonArr.length())
                {
                    JSONObject lstTrainersIdx = lstGroupsJsonArr.getJSONObject(count);
                    A2100_spin_groups_fields spinBeanGroup = new A2100_spin_groups_fields();

                    idGroup = lstTrainersIdx.getString("id");
                    nameGroup = lstTrainersIdx.getString("trainGroup");

                    spinBeanGroup.setIdGroup(idGroup);
                    spinBeanGroup.setNameGroup(nameGroup);

                    a2100_spin_groups_array.add(spinBeanGroup);

                    count++;

                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            returnMessage = "";

        } else if (method.equals("DEL"))
        {

    }

    //@Override
    protected void onProgressUpdate(String values)
    {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result)
    {
        if(result != "") {
            Toast.makeText(ctx,result,Toast.LENGTH_LONG).show();
        }

    }
}

}

Nun der Adapter 
package com.traincounter.jupp.tc;

import java.util.ArrayList; 
import android.app.Activity; 
import android.content.Context; 
import android.content.res.Resources; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView;

/ Adapter class extends with ArrayAdapter */ 
public class A2100_spin_groups_fields_adapter extends ArrayAdapter{

private Activity activity; 
private ArrayList data; 
public Resources res; 
A2100_spin_groups_fields tempValues = null; 
LayoutInflater inflater;

/******* CustomAdapter Constructor *********/ 
public A2100_spin_groups_fields_adapter( 
A2100_member_change activitySpinner, 
int textViewResourceId, 
ArrayList objects, 
Resources resLocal 
) 
{ 
super(activitySpinner, textViewResourceId, objects);

/********** Take passed values **********/
activity = activitySpinner;
data     = objects;
res      = resLocal;

/***********  Layout inflator to call external xml layout () **********************/
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override 
public View getDropDownView(int position, View convertView,ViewGroup parent) { 
System.out.println("dropdownview"); 
return getCustomView(position, convertView, parent); 
}

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
System.out.println("---------------------view"); 
return getCustomView(position, convertView, parent); 
}

// This funtion called for each row ( Called data.size() times ) 
public View getCustomView(int position, View convertView, ViewGroup parent) {

/********** Inflate spinner_rows.xml file for each row ( Defined below ) ************/
View row = inflater.inflate(R.layout.a2100_spin_groups_rowlayout, parent, false);

/***** Get each Model object from Arraylist ********/
tempValues = null;
tempValues = (A2100_spin_groups_fields) data.get(position);

TextView GrpID        = (TextView)row.findViewById(R.id.a2100spinGrp_GroupID);
TextView GrpName      = (TextView)row.findViewById(R.id.a2100spinGrp_GroupName);

// Set values for spinner each row
GrpID.setText(tempValues.getIdGroup());
GrpName.setText(tempValues.getNameGroup());

return row;

}

}

XML der Activity 

xmlns:tools="xyz" 
android:id="@+id/activity_yorokobi_member_change" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
androidaddingBottom="@dimen/activity_vertical_margin" 
androidaddingLeft="@dimen/activity_horizontal_margin" 
androidaddingRight="@dimen/activity_horizontal_margin" 
androidaddingTop="@dimen/activity_vertical_margin" 
tools:context="com.traincounter.jupp.tc.A2100_member_change">

<LinearLayout
    androidrientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:weightSum="1">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/A2100_IDMember" />

    <TextView
        android:text="Mitgliedsname:"
        android:layout_width="match_parent"
        android:id="@+id/A2100_tf_MemberName"
        android:layout_height="wrap_content" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text="Name"
        android:ems="10"
        android:id="@+id/A2100_MemberName"/>

    <TextView
        android:text="Gruppe:"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/A2100_tf_MemberGroup"/>

    <Spinner
        android:id="@+id/A2100_MemberGroup"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:drawSelectorOnTop = "true"/>

    <CheckBox
        android:text="aktives Mitglied"
        android:layout_height="50dp"
        android:layout_width="match_parent"
        android:layout_gravity="center"
        android:id="@+id/A2100_MemberAktiv"/>

    <Button
        android:text="Speichern"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/A2100_Save"
        android:elevation="1dp"
        androidnClick="SetMember" />

    <Button
        android:text="Neu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/A2100_New"
        androidnClick="NewMember" />

    <Button
        android:text="Löschen"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/A2100_DEL"
        androidnClick="DelMember" />

</LinearLayout>

Das RowLayout für den Spinner 

xmlns:app="xyz/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="53dp" 
androidrientation="vertical" 
androidadding="3dp">

<TextView
    android:text="TextView"
    android:layout_width="0dp"
    android:layout_height="50dp"
    android:id="@+id/a2100spinGrp_GroupID"
    android:textSize="20sp"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"/>

<TextView
    android:layout_toRightOf="@id/a2100spinGrp_GroupID"
    android:text="TextView"
    android:layout_width="wrap_content"
    android:layout_height="50dp"
    android:id="@+id/a2100spinGrp_GroupName"
    android:textSize="20sp"
    android:layout_alignParentTop="true" />

Die Klasse für die ITEMS 
package com.traincounter.jupp.tc;

/** 
* Created by Jupp on 13.11.2016. 
*/

public class A2100_spin_groups_fields {

private String idGroup;
private String nameGroup;

public String getNameGroup() {
    return nameGroup;
}

public void setNameGroup(String nameGroup) {
    this.nameGroup = nameGroup;
}

public String getIdGroup() {
    return idGroup;
}

public void setIdGroup(String idGroup) {
    this.idGroup = idGroup;
}

}


----------



## Joob (8. Dez 2016)

Hallo Buggy,
ich mach das mit der DropBox. Muss ich aber noch zusammenstellen.
Dann hast du nur eine Activity.


----------



## buggy84 (9. Dez 2016)

Hallo Joob, Code bitte immer in Code-Tags, sonst wird mir schwindelig. Der Arzt hat auch gesagt, ich soll nich 
Gut, packs zusammen, und dann schauen wir mal drüber. Das wird schon, keine Panik!


----------



## Joob (9. Dez 2016)

Geht es auch mit weTransfer ist einfacher, benötige nur deine Mailadresse.
Die kannst du mir auch auf joob@freenet.de senden, dann sehen die nicht alle.
Ich habe das ganze Projekt gepackt, kannst du so laufen lassen.


----------

