可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I Have two android spinner dropdown in two differnt activity.But both spinner have same data from same sourec.I want to change in position of second Activity acording to position of first activity.How to resolve this issue ?.
Updated code:
First Activity:
public class ServiceRequest extends BaseActivity implements OnItemClickListener {
private List<Item> customerList = new ArrayList<Item>();
private SpinnerAdapter adapter;
public static final String EXTRA_INTENT_CUSTOMER_LIST ="extra_intent_customer_list";
public static final String EXTRA_INTENT_SELECTED_ITEM = "extra_intent_selected_item";
private List<Item> items;
Spinner spin;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.service_request, frameLayout);
;
);
System.out.println("Selected item " Button login = (Button) findViewById(R.id.booking);
final String message = autoCompView.getText().toString();
//Create the bundle
login.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
{
if(customerList.isEmpty()) return;
Item selectedItem = (Item) spin.getSelectedItem();
spin.getSelectedItem().toString(+selectedItem);
Intent intent = new Intent(ServiceRequest.this, Form.class);
// intent.putExtra(EXTRA_INTENT_CUSTOMER_LIST, (Serializable) customerList);
intent.putExtra("seletedItem", selectedItem);
intent.putExtra(EXTRA_INTENT_SELECTED_ITEM, selectedItem);
startActivity(intent);
}
}
});
spin = (Spinner) findViewById(R.id.service_spinner);
adapter = new SpinnerAdapter((ArrayList<Item>) customerList, this);
spin.setAdapter(adapter);
}
public void onStart(){
super.onStart();
BackTask bt=new BackTask();
bt.execute();
}
private class BackTask extends AsyncTask<Void,Void,ArrayList<Item>> {
ArrayList<String> list;
protected void onPreExecute(){
super.onPreExecute();
list=new ArrayList<>();
}
protected ArrayList<Item> doInBackground(Void... params) {
InputStream is = null;
String result = "";
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://my_url/Service.asmx/GetServiceList");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
// Get our response as a String.
is = entity.getContent();
} catch (IOException e) {
e.printStackTrace();
}
//convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
String line = null;
while ((line = reader.readLine()) != null) {
result += line;
}
is.close();
//result=sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
// parse json data
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject obj = jArray.getJSONObject(i);
Item customer = new Item();
customer.setId(obj.getString("ServiceId"));
customer.setName(obj.getString("ServiceName"));
// adding movie to movies array
customerList.add(customer);
}
} catch (JSONException e) {
e.printStackTrace();
}
// adapter.notifyDataSetChanged();
return null;
}
@Override
protected void onPostExecute(ArrayList<Item> customerList) {
if(customerList != null && !customerList.isEmpty()){
adapter.updateDate(customerList);
}
}
}}
Code of second activity
public class Form extends BaseActivity {
// ArrayList<String> listItems = new ArrayList<>();
// ArrayAdapter<String> adapter;
private ArrayList<Item> customerList = new ArrayList<Item>();
private SpinnerAdapter adapter;
private List<Item> items;
AdapterView.OnItemSelectedListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.activity_form, frameLayout);
if(getIntent().hasExtra(ServiceRequest.EXTRA_INTENT_SELECTED_ITEM)){
selectedItem = (Item)getIntent().getSerializableExtra(ServiceRequest.EXTRA_INTENT_SELECTED_ITEM);
}
service_need = (Spinner) findViewById(R.id.service_need);
adapter = new SpinnerAdapter(customerList, this);
service_need.setAdapter(adapter);
/* Commented by me
if(selectedItem != null){
service_need.setSelection(customerList.indexOf(selectedItem));
}*/
/*
Commented for testing :Praveen
Bundle bundle = getIntent().getExtras();
String stuff1 = bundle.getString("local");*/
autoCompView.setText("stuff1");
// position = customerList.indexOf(bundle.getString("name"));
// spin.setSelection(position);
// adapter.notifyDataSetChanged();
// adapter.notifyDataSetChanged();
// String name = bundle.getString("name");
// adapter.add(name);
}
public void onStart() {
super.onStart();
BackTask bt = new BackTask();
bt.execute();
}
private class BackTask extends AsyncTask<Void, Void, ArrayList<Item>> {
ArrayList<String> list;
protected void onPreExecute() {
super.onPreExecute();
// list = new ArrayList<>();
}
protected ArrayList<Item> doInBackground(Void... params) {
InputStream is = null;
String result = "";
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://my_url/Service.asmx/GetServiceList");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
// Get our response as a String.
is = entity.getContent();
} catch (IOException e) {
e.printStackTrace();
}
//convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
String line = null;
while ((line = reader.readLine()) != null) {
result += line;
}
is.close();
//result=sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
// parse json data
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject obj = jArray.getJSONObject(i);
Item customer = new Item();
customer.setId(obj.getString("ServiceId"));
customer.setName(obj.getString("ServiceName"));
customerList.add(customer);
}
} catch (JSONException e) {
e.printStackTrace();
}
// adapter.notifyDataSetChanged();
return null;
}
@Override
protected void onPostExecute(ArrayList<Item> customerList) {
if(customerList != null && !customerList.isEmpty()){
adapter.updateDate(customerList);
if(selectedItem != null){
spin.setSelection(customerList.indexOf(selectedItem));
}
}
}
}
}
Model Class
public class Item implements Serializable {
String id;
String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
if (getId() != item.getId()) return false;
return getName().equals(item.getName());
}
}
Adapeter class
public class SpinnerAdapter extends BaseAdapter {
ArrayList<Item> categories = new ArrayList<>();
Context mContext;
public SpinnerAdapter(ArrayList<Item> categories, Context context){
this.categories = categories;
mContext = context;
}
@Override
public int getCount() {
return categories.size();
}
@Override
public Object getItem(int i) {
return categories.get(i);
}
@Override
public long getItemId(int i) {
return categories.get(i).hashCode();
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
Item item = categories.get(i);
ViewHolder holder = null;
if(view == null){
view = LayoutInflater.from(mContext).inflate(R.layout.spin_row, null);
holder = new ViewHolder();
holder.name = (TextView) view.findViewById(R.id.name);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.name.setText(item.getName());
return view;
}
static class ViewHolder{
TextView name;
}
}
JSON Response
[{"ServiceId":"1","ServiceName":"AC"},
{"ServiceId":"5","ServiceName":"Plumbing"},
{"ServiceId":"3","ServiceName":"Refrigerator"},
{"ServiceId":"7","ServiceName":"Appliances"},
{"ServiceId":"27","ServiceName":"Others"}]
回答1:
You can solve this problem using 2 topic.
SharePrefernce
Intent
SharePrefernce
Store the position of the array of Spinner .
Get the position and set to the Spinner it when you again using .
Example:-
For saving Or storing position into SharePrefernce.
int position = spin.getSelectedItemPosition() ;
PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("position",position ).commit();
For getting or setting value from SharePrefernce to Spinner.
int position = PreferenceManager.getDefaultSharedPreferences(this).getInt("position", 0);
spin.setSelection(position);
Intent
Store the position of the array of Spinner in the intent.
Get the position and set to the Spinner it when you again using intent .
Example:-
For saving Or storing position into Intent.
int position = spin.getSelectedItemPosition() ;
Intent myIntent = new Intent(A.this, B.class);
myIntent.putExtra("position", position);
startActivity(myIntent);
For getting or setting value from Intent to Spinner.
Intent mIntent = getIntent();
int position = mIntent.getIntExtra("position", 0);
spin.setSelection(position);
This both are working .I already checked it.
回答2:
private List<Item> customerList = new ArrayList<Item>();
Customer list is the list of data model "Item", a pojo class.
position = customerList.indexOf(bundle.getString("name"));
In this line you are trying to get index of selected item by passing string.
Array list will not be able to compare two different type of object.
You have to pass a "item" instance :
position = customerList.indexOf(item);
And you have to override "equals" methods in Item class using some unique properties of the class.
This equals method will be used to compare two object and list will return index of object if present in the list. Please check this and this for clarification.
Data Modal class
public class Item implements Serializable {
int id;
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
if (getId() != item.getId()) return false;
return getName().equals(item.getName());
}
}
Activity class
package spinner.sample.spinnerexample;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Spinner;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private Spinner spinner;
ArrayList<Item> customerList = new ArrayList<>();
SpinnerAdapter spinnerAdapter;
public static final String EXTRA_INTENT_CUSTOMER_LIST ="extra_intent_customer_list";
public static final String EXTRA_INTENT_SELECTED_ITEM = "extra_intent_selected_item";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner)findViewById(R.id.spinner);
createList();
spinnerAdapter = new SpinnerAdapter(customerList, this);
spinner.setAdapter(spinnerAdapter);
}
private void createList(){
Item item1 = new Item();
item1.setId(14);
item1.setName("Automobile");
Item item2 = new Item();
item2.setId(15);
item2.setName("Business Services");
Item item3 = new Item();
item3.setId(16);
item3.setName("Business");
Item item4 = new Item();
item4.setId(17);
item4.setName("Computers");
Item item5 = new Item();
item5.setId(18);
item5.setName("Computers Acc");
Item item6 = new Item();
item6.setId(19);
item6.setName("Education");
Item item7 = new Item();
item7.setId(20);
item7.setName("Personal");
customerList.add(item1);
customerList.add(item2);
customerList.add(item3);
customerList.add(item4);
customerList.add(item5);
customerList.add(item6);
customerList.add(item7);
}
public void onClick(View view){
if(customerList.isEmpty()) return;
Item selectedItem = (Item) spinner.getSelectedItem();
System.out.println("Selected item "+selectedItem);
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(EXTRA_INTENT_CUSTOMER_LIST, customerList);
intent.putExtra(EXTRA_INTENT_SELECTED_ITEM, selectedItem);
startActivity(intent);
}
}
Activity 2
package spinner.sample.spinnerexample;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Spinner;
import java.util.ArrayList;
public class SecondActivity extends AppCompatActivity {
private Spinner spinner;
ArrayList<Item> customerList = new ArrayList<>();
SpinnerAdapter spinnerAdapter;
Item selectedItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
if(getIntent().hasExtra(MainActivity.EXTRA_INTENT_CUSTOMER_LIST)){
customerList = (ArrayList<Item>) getIntent().getSerializableExtra(MainActivity.EXTRA_INTENT_CUSTOMER_LIST);
}
if(getIntent().hasExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM)){
selectedItem = (Item)getIntent().getSerializableExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM);
}
spinner = (Spinner)findViewById(R.id.spinner);
if(customerList.isEmpty()) return;
spinnerAdapter = new SpinnerAdapter(customerList, this);
spinner.setAdapter(spinnerAdapter);
if(selectedItem != null){
spinner.setSelection(customerList.indexOf(selectedItem));
}
}
}
Adapter :
package spinner.sample.spinnerexample;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by praveen on 17/8/16.
*/
public class SpinnerAdapter extends BaseAdapter {
ArrayList<Item> categories = new ArrayList<>();
Context mContext;
public SpinnerAdapter(ArrayList<Item> categories, Context context){
this.categories = categories;
mContext = context;
}
@Override
public int getCount() {
return categories.size();
}
@Override
public Object getItem(int i) {
return categories.get(i);
}
@Override
public long getItemId(int i) {
return categories.get(i).hashCode();
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
Item item = categories.get(i);
ViewHolder holder = null;
if(view == null){
view = LayoutInflater.from(mContext).inflate(R.layout.spinner_item, null);
holder = new ViewHolder();
holder.name = (TextView) view.findViewById(R.id.txt_view_spinner_item);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.name.setText(item.getName());
return view;
}
static class ViewHolder{
TextView name;
}
}
回答3:
This should be the Intent
in the ServiceRequest
activity:
Intent intent = new Intent(ServiceRequest.this, Form.class);
Bundle extras = new Bundle();
extras.putString("local", autoCompView.getText().toString());
extras.putInt("position", spin.getSelectedItemPosition());
intent.putExtras(extras);
startActivity(intent);
And this should be how you set the Spinner
in the onCreate()
method of your Form
activity:
spin = (Spinner) findViewById(R.id.spinner);
adapter = new SpinAdapter(this, customerList);
spin.setAdapter(adapter);
Bundle extras = getIntent().getExtras();
spin.setSelection(extras.getInt("position"));
回答4:
I can found the solution. Try to change your both activity code with this,
public class MainActivity extends AppCompatActivity{
private ArrayList<Item> customerList = new ArrayList<Item>();
private SpinnerAdapter adapter;
public static final String EXTRA_INTENT_CUSTOMER_LIST ="extra_intent_customer_list";
public static final String EXTRA_INTENT_SELECTED_ITEM = "extra_intent_selected_item";
private List<Item> items;
Spinner spin;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// getLayoutInflater().inflate(R.layout.activity_main, null);
Button login = (Button) findViewById(R.id.login);
spin = (Spinner) findViewById(R.id.service_spinner);
assert login != null;
login.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
if (spin.getSelectedItemPosition() == 0) {
Toast.makeText(MainActivity.this, "Please Select item", Toast.LENGTH_SHORT).show();
}
else {
if(customerList.isEmpty()) return;
Item selectedItem = (Item) spin.getSelectedItem();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra(EXTRA_INTENT_SELECTED_ITEM, spin.getSelectedItemPosition());
startActivity(intent);
}
}
});
for (int i = 0; i < 1; i++) {
Item customer = new Item();
customer.setId(""+i);
customer.setName("Select Obj");
// adding movie to movies array
customerList.add(customer);
}
adapter = new SpinnerAdapter((ArrayList<Item>) customerList, this);
spin.setAdapter(adapter);
}
public void onStart(){
super.onStart();
BackTask bt=new BackTask();
bt.execute();
}
private class BackTask extends AsyncTask<Void,Void,ArrayList<Item>> {
protected void onPreExecute(){
super.onPreExecute();
}
protected ArrayList<Item> doInBackground(Void... params) {
InputStream is = null;
String result = "";
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://my_url/json");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
// Get our response as a String.
is = entity.getContent();
} catch (IOException e) {
e.printStackTrace();
}
//convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
String line = null;
while ((line = reader.readLine()) != null) {
result += line;
}
is.close();
//result=sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
// parse json data
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject obj = jArray.getJSONObject(i);
Item customer = new Item();
customer.setId(obj.getString("ServiceId"));
customer.setName(obj.getString("ServiceName"));
// adding movie to movies array
customerList.add(customer);
}
} catch (JSONException e) {
e.printStackTrace();
}
return customerList;
}
@Override
protected void onPostExecute(ArrayList<Item> customerList) {
if(customerList != null && !customerList.isEmpty()){
// adapter.updateDate(customerList);
adapter.notifyDataSetChanged();
}
}
}}
And SecondActivity:
public class SecondActivity extends AppCompatActivity {
private static final String REGISTER_URL = "http://my_url/Service.asmx/GenerateTicket";
public static final String PREFS_NAME = "MyPrefsFile";
public static final String CUSTOMERID = "customerId";
public static final String USERNAME = "name";
public static final String HOUSENO = "houseNo";
public static final String LOCALITY = "areaName";
public static final String SERVICE = "serviceId";
public static final String MOBILE = "mobile";
public static final String EMAIL = "email";
public static final String PROBLEM = "jobBrief";
private ProgressDialog pDialog;
Spinner spin;
String service;
Item selectedItem;
// flag for Internet connection status
Boolean isInternetPresent = false;
private ArrayList<Item> customerList = new ArrayList<Item>();
private SpinnerAdapter adapter;
private List<Item> items;
AdapterView.OnItemSelectedListener listener;
Spinner service_need;
AutoCompleteTextView autoCompView;
String obj;
int pos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//getLayoutInflater().inflate(R.layout.activity_second, null);
if(getIntent().hasExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM)){
pos = getIntent().getIntExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM,0);
}
service_need = (Spinner) findViewById(R.id.service_need);
for (int i = 0; i < 1; i++) {
Item customer = new Item();
customer.setId(""+i);
customer.setName("Select Obj");
// adding movie to movies array
customerList.add(customer);
}
adapter = new SpinnerAdapter(customerList, this);
service_need.setAdapter(adapter);
}
public void onStart() {
super.onStart();
BackTask bt = new BackTask();
bt.execute();
}
private class BackTask extends AsyncTask<Void, Void, ArrayList<Item>> {
ArrayList<String> list;
protected void onPreExecute() {
super.onPreExecute();
}
protected ArrayList<Item> doInBackground(Void... params) {
InputStream is = null;
String result = "";
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://my_url/json");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
// Get our response as a String.
is = entity.getContent();
} catch (IOException e) {
e.printStackTrace();
}
//convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
String line = null;
while ((line = reader.readLine()) != null) {
result += line;
}
is.close();
//result=sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
// parse json data
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject obj = jArray.getJSONObject(i);
Item customer = new Item();
customer.setId(obj.getString("ServiceId"));
customer.setName(obj.getString("ServiceName"));
customerList.add(customer);
}
} catch (JSONException e) {
e.printStackTrace();
}
return customerList;
}
@Override
protected void onPostExecute(ArrayList<Item> customerList) {
if(customerList != null && !customerList.isEmpty()){
service_need.setSelection(pos);
}
}
}}
Issue1: NullPointerException in SecondActivity due to null object spinner. Spinner Id in second activity is Service_need.
Issue2: Back_task DoInBackground method in SecondActivity return null,it must return ArrayList to validate in OnPostExecute.
Thanks.
Hope it helps.!
回答5:
Try to get the position of the selected name in the first activity by getting it through the List
in second activity.
position = customerList.indexOf(bundle.getString("name"));
spin.setSelection(position,false);
回答6:
Use setSelection(position)
in place of setSelection(position, false)
回答7:
get first spinner position and pass another activity through intent and set first spinner position to second spinner. (second spinner must be custom like spinner inflate with edittext).
回答8:
lets assume your position
is correct, but you can verify with a simple Log.d(tag, "pos:"+position)
and that your spinner is being correctly populated with customerList
(you can visually verify that or Log.d(tag, "size:"+adapter.getCount())
or spin.getCount()
)
2 things (or both) to try:
your adapter.notifyDataSetChanged()
should come immediately after customerList.addAll(position,customerList)
. if you do setSelection
before that, then your spinner is still empty.
small chance your spinner ui is not ready yet, so do this:
spin.post(new Runnable() {
@Override
public void run() {
spin.setSelection(position);
}
});