Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Populating Spinner using ArrayList in Android

I have an activity in which I have to parse an XML and populate a Spinner using the parsed data.

I am done with parsing the XML. This is the method:

void parse_ExamList()
                    {

                        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

                        XMLParser parser = new XMLParser();
                        //String xml = parser.getXmlFromUrl(URL); // getting XML
                        Document doc = parser.getDomElement(xmlContent); // getting DOM element

                        //count_questions=2;

                        NodeList nl = doc.getElementsByTagName(KEY_EXAMSET);
                        // looping through all item nodes <item>
                        for ( int i = 0; i < nl.getLength();i++) {


//                      while(counter< nl.getLength())
//                      {
                            // creating new HashMap
                            HashMap<String, String> map = new HashMap<String, String>();

                            Element e = (Element) nl.item(i);
                            // adding each child node to HashMap key => value
                            //map.put(KEY_EXAMSET, parser.getValue(e, KEY_EXAMSET));
                            map.put(KEY_SETID, parser.getValue(e, KEY_SETID));
                            map.put(KEY_SETNAME, parser.getValue(e, KEY_SETNAME));
                            //Log.i("Set ID: ", parser.getValue(e, KEY_SETID));
                            //Log.i("Set Name: ", parser.getValue(e, KEY_SETNAME));

                            menuItems.add(map);
                        }


                    }

If you notice you can see that KEY_SETID and KEY_SETNAME to the arraylist. I have to populate the spinner with the KEY_SETNAME and the KEY_SETID will not be shown in the spinner. But if the item is clicked then the id corresponding to the name should be acquired in order to send to the server.

I have a method to populate a spinner, like this:

// add items into exam list spinner dynamically
                    public void addItemsOnExamListSpinner()
                    {
                        List<String> list = new ArrayList<String>();
                        list.add("Speed Test 150(min) PO Set-01");

                        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_spinner_item, list);
                        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        exam_list_spinner.setAdapter(dataAdapter);
                    }

How should I populate the spinner with the ArrayList that is obtained while parsing the XML?

This is the full activity:

public class SpeedTestExamNameActivity extends Activity {

    Spinner exam_list_spinner;
    Button  detailsBtn;
    TextView showUser;
    String full_name;

    //variables to get response from server
    String responseBody;

    //variables required for parsing the XML
    String xmlContent=null;

 // XML node keys
    static final String KEY_EXAMSET = "ExamSet"; // parent node
    static final String KEY_SETID = "SetId";
    static final String KEY_SETNAME = "SetName";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_speed_test_exam_name);

        //checking internet connectivity to download list
        isOnline_downloadList();

        //Showing user full name after login
        full_name=getFromPreference("user_name");
        //textview to show user name
        showUser=(TextView)findViewById(R.id.speed_username_textView);
        showUser.setText("Welcome, "+full_name);
        //spinner
        exam_list_spinner = (Spinner) findViewById(R.id.speed_examlist_spinner);
        //adding items to spinners
        addItemsOnExamListSpinner();

        // onclick details button
        detailsBtn = (Button) findViewById(R.id.speed_exam_details_button);
        detailsBtn.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        Toast.makeText(SpeedTestExamNameActivity.this,                      
                                "Exam List Spinner: "+ String.valueOf(exam_list_spinner.getSelectedItem()),
                                Toast.LENGTH_SHORT).show();

                        Intent intent = new Intent(SpeedTestExamNameActivity.this, SpeedTestActivity.class);
                        SpeedTestExamNameActivity.this.startActivity(intent);
                    }
                  });
    }



    //getting content from preferences
        public String getFromPreference(String variable_name)
        {
            String preference_return;
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            preference_return = preferences.getString(variable_name,"");

           return preference_return;
        }


        //check connection
        public boolean isOnline_downloadList() {
            ConnectivityManager cm =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnectedOrConnecting()) {

                //sending request for login
                new MyAsyncTask().execute(getFromPreference("student_code"));



                return true;
            }

          //alert box to show internet connection error
            AlertDialog.Builder Internet_Alert = new AlertDialog.Builder(SpeedTestExamNameActivity.this);
            // set title
            Internet_Alert.setCancelable(false);
            Internet_Alert.setTitle("Attention!");
            Internet_Alert.setMessage("This application requires internet connectivity, no internet connection detected");
            Internet_Alert.setPositiveButton("Quit", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) 
                {
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    onQuitPressed(); 
                }
            });

            Internet_Alert.create().show();
            return false;
        }

        //to remove application from task manager
        public void onQuitPressed() {

            int pid = android.os.Process.myPid();
            android.os.Process.killProcess(pid);
        }



        //===================================================================================================================================
        //sending student code to server to get exam list
        //===================================================================================================================================
        private class MyAsyncTask extends AsyncTask<String, Integer, Double>{


            @Override
            protected Double doInBackground(String... params) {
                // TODO Auto-generated method stub
                postData(params[0]);
                return null;
            }

            protected void onPostExecute(Double result){

                //Toast.makeText(getApplicationContext(), responseBody, Toast.LENGTH_LONG).show();
                //Log.i("response: ", responseBody);
                //processResponce(responseBody);
                //going to next activity
                xmlContent=responseBody;
                parse_ExamList();
            }

            protected void onProgressUpdate(Integer... progress){

            }

            public void postData(String student_code) {
                // Create a new HttpClient and Post Header
                HttpClient httpclient = new DefaultHttpClient();
                //HttpPost httppost = new HttpPost("http://icaerp.com/AndroidDataService/dataServiceAndroid.asmx/login");

                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(SpeedTestExamNameActivity.this);
                  final String url_first = preferences.getString("URLFirstPart","");
                HttpPost httppost = new HttpPost(url_first+"ExamList");

                try {
                    // Data that I am sending
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("StudentCode", student_code));
                    //nameValuePairs.add(new BasicNameValuePair("Password", passwrd));
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    // Execute HTTP Post Request
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    responseBody = EntityUtils.toString(response.getEntity());

                    Log.d("result", responseBody);
                } 
                catch (Throwable t ) {
                    //Toast.makeText( getApplicationContext(),""+t,Toast.LENGTH_LONG).show();
                    Log.d("Error Time of Login",t+"");
                } 
            }
        }
        //===================================================================================================================================
        //END sending EmailAddress and Password to server 
        //===================================================================================================================================

        // function to populate SPINNER with exam list from xml
                    void parse_ExamList()
                    {

                        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

                        XMLParser parser = new XMLParser();
                        //String xml = parser.getXmlFromUrl(URL); // getting XML
                        Document doc = parser.getDomElement(xmlContent); // getting DOM element

                        //count_questions=2;

                        NodeList nl = doc.getElementsByTagName(KEY_EXAMSET);
                        // looping through all item nodes <item>
                        for ( int i = 0; i < nl.getLength();i++) {


//                      while(counter< nl.getLength())
//                      {
                            // creating new HashMap
                            HashMap<String, String> map = new HashMap<String, String>();

                            Element e = (Element) nl.item(i);
                            // adding each child node to HashMap key => value
                            //map.put(KEY_EXAMSET, parser.getValue(e, KEY_EXAMSET));
                            map.put(KEY_SETID, parser.getValue(e, KEY_SETID));
                            map.put(KEY_SETNAME, parser.getValue(e, KEY_SETNAME));
                            //Log.i("Set ID: ", parser.getValue(e, KEY_SETID));
                            //Log.i("Set Name: ", parser.getValue(e, KEY_SETNAME));

                            menuItems.add(map);
                        }


                    }

                    // add items into exam list spinner dynamically
                    public void addItemsOnExamListSpinner()
                    {
                        List<String> list = new ArrayList<String>();
                        list.add("Speed Test 150(min) PO Set-01");

                        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_spinner_item, list);
                        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        exam_list_spinner.setAdapter(dataAdapter);
                    }


}

This is the layout file:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".SpeedTestExamNameActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="@string/speed_choose_exam"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Spinner
        android:id="@+id/speed_examlist_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="68dp" />

    <Button
        android:id="@+id/speed_exam_details_button"
        android:layout_width="95dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/speed_examlist_spinner"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="36dp"
        android:text="@string/details" />

    <TextView
        android:id="@+id/speed_username_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Name Title"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

What should I do to populate the Spinner from the Arraylist returned by the XML parsing method?

like image 439
kittu88 Avatar asked Mar 14 '13 08:03

kittu88


2 Answers

This is how you can go about doing it.

First, create a POJO MyObject, which has the 2 fields KEY_SETID and KEY_SETNAME and its related getter/setter. Override the toString(), to return KEY_SETNAME, as you want to display this as the item name in the Spinner.

Then create an ArrayList of your MyObject, from the HashMap you populated by parsing your XML.

Then using the sample code snippet below, populate data in your Spinner.

Spinner s = (Spinner) findViewById(R.id.SpinnerSpcial);
ArrayList<MyObject> objects = new ArrayList<MyObject>(); // This is actually the list created from the HashMap
ArrayAdapter<MyObject> adapter = new ArrayAdapter<ObjectName>(this, android.R.layout.simple_spinner_item, objects);
s.setAdapter(adapter);

Now to get the item selected, use the below code.

MyObject selectedItem = (MyObject) s.getSelectedItem(); // Object which was selected.
selectedItem.getKEY_SETID(); // This will give you the ID of the item selected. Do whatever you wish with to do.

Try it out and let me know, if you're stuck up anywhere.

Update:-

Your POJO will be like this.

public class MyObject {
    private String KEY_SETID;
    private String KEY_SETNAME;

    public String getKEY_SETID() {
        return KEY_SETID;
    }

    public void setKEY_SETID(String kEY_SETID) {
        KEY_SETID = kEY_SETID;
    }

    public String getKEY_SETNAME() {
        return KEY_SETNAME;
    }

    public void setKEY_SETNAME(String kEY_SETNAME) {
        KEY_SETNAME = kEY_SETNAME;
    }

    @Override
    public String toString() {
        return this.KEY_SETNAME; // Value to be displayed in the Spinner
    }
}
like image 156
Rahul Avatar answered Sep 20 '22 20:09

Rahul


Tip:Try to make the code simple and working.So first,in your parsing function instead of adding a HashMap to the ArrayList .. take two arraylists and these ArrayLists should be declared at a class level.Correspondingly,fill both ArrayLists and fetch them at Spinner click.So your Activity code stands:

    public class SpeedTestExamNameActivity extends Activity {

        Spinner exam_list_spinner;
        Button  detailsBtn;
        TextView showUser;
    String full_name;
    ArrayList<String> menuItems = new ArrayList<String>();
    ArrayList<String> menuKeys = new ArrayList<String>();

    //variables to get response from server
    String responseBody;

    //variables required for parsing the XML
    String xmlContent=null;

     // XML node keys
        static final String KEY_EXAMSET = "ExamSet"; // parent node
        static final String KEY_SETID = "SetId";
        static final String KEY_SETNAME = "SetName";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_speed_test_exam_name);

        //checking internet connectivity to download list
        isOnline_downloadList();

        //Showing user full name after login
        full_name=getFromPreference("user_name");
        //textview to show user name
        showUser=(TextView)findViewById(R.id.speed_username_textView);
        showUser.setText("Welcome, "+full_name);
        //spinner
        exam_list_spinner = (Spinner) findViewById(R.id.speed_examlist_spinner);
        //adding items to spinners
        addItemsOnExamListSpinner();

        // onclick details button
        detailsBtn = (Button) findViewById(R.id.speed_exam_details_button);
        detailsBtn.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        Toast.makeText(SpeedTestExamNameActivity.this,                      
                                "Exam List Spinner: "+ 

    String.valueOf(exam_list_spinner.getSelectedItem()),
                                    Toast.LENGTH_SHORT).show();
    //here you get the menuKey too
    Toast.makeText(SpeedTestExamNameActivity.this,                      
                                    "Exam List Spinner Key: "+ menuKeys.get(exam_list_spinner.getSelectedItemPosition()),
                                    Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(SpeedTestExamNameActivity.this, SpeedTestActivity.class);
                        SpeedTestExamNameActivity.this.startActivity(intent);
                    }
                  });
    }



    //getting content from preferences
        public String getFromPreference(String variable_name)
        {
            String preference_return;
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            preference_return = preferences.getString(variable_name,"");

           return preference_return;
        }


        //check connection
        public boolean isOnline_downloadList() {
            ConnectivityManager cm =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnectedOrConnecting()) {

                //sending request for login
                new MyAsyncTask().execute(getFromPreference("student_code"));



                return true;
            }

          //alert box to show internet connection error
            AlertDialog.Builder Internet_Alert = new AlertDialog.Builder(SpeedTestExamNameActivity.this);
            // set title
            Internet_Alert.setCancelable(false);
            Internet_Alert.setTitle("Attention!");
            Internet_Alert.setMessage("This application requires internet connectivity, no internet connection detected");
            Internet_Alert.setPositiveButton("Quit", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) 
                {
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    onQuitPressed(); 
                }
            });

            Internet_Alert.create().show();
            return false;
        }

        //to remove application from task manager
        public void onQuitPressed() {

            int pid = android.os.Process.myPid();
            android.os.Process.killProcess(pid);
        }



        //===================================================================================================================================
        //sending student code to server to get exam list
        //===================================================================================================================================
        private class MyAsyncTask extends AsyncTask<String, Integer, Double>{


            @Override
            protected Double doInBackground(String... params) {
                // TODO Auto-generated method stub
                postData(params[0]);
                return null;
            }

            protected void onPostExecute(Double result){

                //Toast.makeText(getApplicationContext(), responseBody, Toast.LENGTH_LONG).show();
                //Log.i("response: ", responseBody);
                //processResponce(responseBody);
                //going to next activity
                xmlContent=responseBody;
                parse_ExamList();
            }

            protected void onProgressUpdate(Integer... progress){

            }

            public void postData(String student_code) {
                // Create a new HttpClient and Post Header
                HttpClient httpclient = new DefaultHttpClient();
                //HttpPost httppost = new HttpPost("http://icaerp.com/AndroidDataService/dataServiceAndroid.asmx/login");

                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(SpeedTestExamNameActivity.this);
                  final String url_first = preferences.getString("URLFirstPart","");
                HttpPost httppost = new HttpPost(url_first+"ExamList");

                try {
                    // Data that I am sending
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    nameValuePairs.add(new BasicNameValuePair("StudentCode", student_code));
                    //nameValuePairs.add(new BasicNameValuePair("Password", passwrd));
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    // Execute HTTP Post Request
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    responseBody = EntityUtils.toString(response.getEntity());

                    Log.d("result", responseBody);
                } 
                catch (Throwable t ) {
                    //Toast.makeText( getApplicationContext(),""+t,Toast.LENGTH_LONG).show();
                    Log.d("Error Time of Login",t+"");
                } 
            }
        }
        //===================================================================================================================================
        //END sending EmailAddress and Password to server 
        //===================================================================================================================================

        // function to populate SPINNER with exam list from xml
                    void parse_ExamList()
                    {



                        XMLParser parser = new XMLParser();
                        //String xml = parser.getXmlFromUrl(URL); // getting XML
                        Document doc = parser.getDomElement(xmlContent); // getting DOM element

                        //count_questions=2;

                        NodeList nl = doc.getElementsByTagName(KEY_EXAMSET);
                        // looping through all item nodes <item>
                        for ( int i = 0; i < nl.getLength();i++) {


//                      while(counter< nl.getLength())
//                      {

                            Element e = (Element) nl.item(i);
                            // adding each child node to HashMap key => value
                            //map.put(KEY_EXAMSET, parser.getValue(e, KEY_EXAMSET));
                            menuKeys.add( parser.getValue(e, KEY_SETID));
                            menuItems.add( parser.getValue(e, KEY_SETNAME));
                            //Log.i("Set ID: ", parser.getValue(e, KEY_SETID));
                            //Log.i("Set Name: ", parser.getValue(e, KEY_SETNAME));


                        }


                    }

                    // add items into exam list spinner dynamically
                    public void addItemsOnExamListSpinner()
                    {
                        List<String> list = new ArrayList<String>();
                        list.add("Speed Test 150(min) PO Set-01");

                        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_spinner_item, menuItems);
                        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        exam_list_spinner.setAdapter(dataAdapter);
                    }


}

Note: Simple replace will do.I have only changed code in detailsBtn.setOnClickListener(new View.OnClickListener() { and your parseExamList() and just declared two ArrayLists at the class level.try it and see if you get two Toasts on Clicking details button before launching the new activity.

UPDATE: i assume that you've followed the android hive tutorial for parsing XML.Just change the getValue function with this in your XMLParser class:

public String getValue(Element item, String str) {
    NodeList n = item.getElementsByTagName(str);
    return this.getElementValue(n.item(0));
}

But in case you're not following that.. then following that tutorial to build the parser would solve your issue.Insha Allah.If i have helped you to reach a solution then please mark it as an answer

like image 41
Nezam Avatar answered Sep 19 '22 20:09

Nezam