How to change the position of a spinner according to position of other spinner in two different activities

纵然是瞬间 提交于 2020-01-03 06:56:06

问题


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.

  1. SharePrefernce

  2. 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:

  1. your adapter.notifyDataSetChanged() should come immediately after customerList.addAll(position,customerList). if you do setSelection before that, then your spinner is still empty.

  2. small chance your spinner ui is not ready yet, so do this:

    spin.post(new Runnable() {
        @Override
        public void run() {
            spin.setSelection(position);
        }
    });
    


来源:https://stackoverflow.com/questions/38929897/how-to-change-the-position-of-a-spinner-according-to-position-of-other-spinner-i

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!