[英]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. 我有一个活动,我必须解析XML并使用解析的数据填充Spinner。
I am done with parsing the XML. 我完成了解析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. 如果你注意到你可以看到KEY_SETID和KEY_SETNAME到arraylist。 I have to populate the spinner with the KEY_SETNAME and the KEY_SETID will not be shown in the spinner.
我必须使用KEY_SETNAME填充微调器,并且不会在微调器中显示KEY_SETID 。 But if the item is clicked then the id corresponding to the name should be acquired in order to send to the server.
但是,如果单击该项,则应获取与该名称对应的id,以便发送到服务器。
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? 我应该如何使用解析XML时获得的ArrayList填充微调器?
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? 我该怎么做才能从XML解析方法返回的Arraylist中填充Spinner?
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
. 首先,创建一个POJO
MyObject
,它有2个字段KEY_SETID和KEY_SETNAME及其相关的getter/setter
。 Override the toString()
, to return KEY_SETNAME
, as you want to display this as the item name in the Spinner
. 重写
toString()
,返回KEY_SETNAME
,因为您希望在Spinner
中将其显示为项目名称。
Then create an ArrayList
of your MyObject
, from the HashMap
you populated by parsing your XML. 然后从解析XML填充的
HashMap
创建MyObject
的ArrayList
。
Then using the sample code snippet below, populate data in your Spinner
. 然后使用下面的示例代码段填充
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. 你的POJO会是这样的。
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
}
}
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 ArrayList
s should be declared at a class level.Correspondingly,fill both ArrayList
s and fetch them at Spinner
click.So your Activity
code stands: 提示:尝试使代码变得简单和有效。首先,在解析函数中而不是向
ArrayList
添加HashMap
。取两个arraylists,这些ArrayList
应该在类级别声明。相应地,填充两个ArrayList
和在Spinner
click中获取它们。所以你的Activity
代码代表:
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. 注意:简单替换就行了。我只更改了
detailsBtn.setOnClickListener(new View.OnClickListener() {
代码detailsBtn.setOnClickListener(new View.OnClickListener() {
和你的parseExamList()
并在类level.try中声明了两个ArrayLists
,看看你是否在点击时获得两个Toast启动新活动之前的详细信息按钮。
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: 更新:我假设您已经按照Android hive教程解析XML。只需在
XMLParser
类中更改getValue
函数:
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 但是如果你不遵循那个......那么按照那个教程来构建解析器就可以解决你的问题.Insha Allah。如果我帮助你找到解决方案那么请把它标记为答案
Spinner spinnerLocation;
spinnerLocation = (Spinner)findViewById(R.id.spinnerLocation);
ArrayList<String> locationArray = new ArrayList<String>();
for(int i=0;i<10;i++)
{
locationArray.add("value "+i);
}
ArrayAdapter<String> locationAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, locationArray);
locationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerLocation = (Spinner)findViewById(R.id.spinnerLocation);
spinnerLocation.setAdapter(locationAdapter);
spinnerLocation.setAdapter(locationAdapter);
spinnerLocation.setOnItemSelectedListener(new OnItemSelectedListener() {
int count=0;
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
System.out.println("whatever you wanna do");
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
Toast.makeText(getBaseContext(),"inside no item selected ",Toast.LENGTH_SHORT).show();
}
});
I have done a workaround by changing my code xml parsing code to this: 我已经通过将我的代码xml解析代码更改为:
void parse_ExamList()
{
ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
Document doc = parser.getDomElement(xmlContent); // getting DOM element
//list object to populate spinner
List<String> list = new ArrayList<String>();
NodeList nl = doc.getElementsByTagName(KEY_EXAMSET);
// looping through all item nodes <item>
for ( int i = 0; i < nl.getLength();i++) {
// 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));
//adding items to spinners
list.add("("+parser.getValue(e, KEY_SETID)+") "+parser.getValue(e, KEY_SETNAME));
menuItems.add(map);
}
//populating the spinner with the list items
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);
}
But the problem is that, both the id and name are getting displayed in the spinner, I just want to show the name and hide the id while displaying. 但问题是,id和name都显示在微调器中,我只想显示名称并在显示时隐藏id。 But later I will require the id with the selected name
但是后来我会要求带有所选名称的id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.