国家,州和城市微调器无法正常工作

时间:2016-04-13 15:47:45

标签: java android android-studio android-volley android-spinner

我一直在使用注册表单应用程序,其中使用了很少的微调器小部件。微调器用于选择国家城市。因此,这些微调器需要以某种方式相互连接(下面的代码将说明我是如何尝试实现的)。

表格代码:

fragment_register.xml

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="true">


<TextView
    android:text="Student Registration Form"
    android:textSize="22sp"
    android:textAlignment="center"
    android:layout_marginBottom="20dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/country_spinner"
        android:foregroundTint="#222"
        android:background="#001c47"
        android:layout_marginBottom="20dp" />

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/state_spinner"
        android:foregroundTint="#222"
        android:background="#001c47"
        android:layout_marginBottom="20dp" />

    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/city_spinner"
        android:foregroundTint="#222"
        android:background="#001c47"
        android:layout_marginBottom="20dp" />

</LinearLayout>
</ScrollView>

上面的代码有更多的小部件,你可以在java文件中找到它们;我没有将它们包含在上面的代码中,因为它会使它太长。

RegisterFragement.java

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.SharedPreferences;
import android.nfc.Tag;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

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

import java.util.ArrayList;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.AppCompatButton;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;


public class RegisterFragment extends Fragment  implements View.OnClickListener, Spinner.OnItemSelectedListener{

private AppCompatButton btn_register;
private EditText et_email,et_password,et_name;
private TextView tv_login;
private ProgressBar progress;
//Declaring the Spinners
private Spinner country_spinner;
private Spinner state_spinner;
private Spinner city_spinner;


//An ArrayList for Spinner Items
private ArrayList<String> results;
// countGetData: It will keep a count of how many times get data has been run and for 0 times
// it would set the spinners to default state
private int countGetData;
ArrayList student1 = new ArrayList();


//JSON Array
private JSONArray resultArray;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_register,container,false);
    initViews(view);
    return view;

}

private void initViews(View view){

    btn_register = (AppCompatButton)view.findViewById(R.id.btn_register);
    tv_login = (TextView)view.findViewById(R.id.tv_login);
    et_name = (EditText)view.findViewById(R.id.et_name);
    et_email = (EditText)view.findViewById(R.id.et_email);
    et_password = (EditText)view.findViewById(R.id.et_password);

    progress = (ProgressBar)view.findViewById(R.id.progress);

    btn_register.setOnClickListener(this);
    tv_login.setOnClickListener(this);
    //Initializing the ArrayList
    results = new ArrayList<String>();
    // Initializing countGetData
    countGetData = 0;

    //Initializing Spinner
    country_spinner = (Spinner) view.findViewById(R.id.country_spinner);
    state_spinner = (Spinner) view.findViewById(R.id.state_spinner);
    city_spinner = (Spinner) view.findViewById(R.id.city_spinner);


    //Adding an Item Selected Listener to our Spinner
    //As we have implemented the class Spinner.OnItemSelectedListener to this class iteself we are passing this to setOnItemSelectedListener
    country_spinner.setOnItemSelectedListener(this);
    state_spinner.setOnItemSelectedListener(this);
    city_spinner.setOnItemSelectedListener(this);
    university_spinner.setOnItemSelectedListener(this);
    college_spinner.setOnItemSelectedListener(this);
    ca_spinner.setOnItemSelectedListener(this);


    getData("getCountries", "", 0);
}


@Override
public void onClick(View v) {

    switch (v.getId()){
        case R.id.tv_login:
            goToLogin();
            break;

        case R.id.btn_register:

            String name = et_name.getText().toString();
            String email = et_email.getText().toString();
            String password = et_password.getText().toString();

            if(!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {

                progress.setVisibility(View.VISIBLE);
                registerProcess(name,email,password);

            } else {

                Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show();
            }
            break;

    }

}

private void getData(String urlPart1,String urlPart2, long itemId) {
    //Creating a string request
    StringRequest stringRequest = new StringRequest(Config.DATA_URL+urlPart1+"&"+urlPart2+"="+itemId,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    JSONObject j = null;
                    try {
                        //Parsing the fetched Json String to JSON Object
                        j = new JSONObject(response);

                        //Storing the Array of JSON String to our JSON Array
                        resultArray = j.getJSONArray(Config.JSON_ARRAY);

                        //Calling method getStudents to get the students from the JSON Array
                        getResults(resultArray);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                }
            });

//Creating a request queue
        RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
    //Adding request to the queue
    requestQueue.add(stringRequest);

}

private void getResults(JSONArray j) {
    //Traversing through all the items in the json array
    for (int i = 0; i < j.length(); i++) {
        try {
            //Getting json object
            JSONObject json = j.getJSONObject(i);

            //Adding the name of the student to array list
            results.add(json.getString(Config.TAG_NAME));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    if(countGetData == 0) {
        student1.add("Select This");
        //Setting adapter to show the items in the spinner
        country_spinner.setAdapter(new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, results));
        state_spinner.setAdapter(new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, student1));
        city_spinner.setAdapter(new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, student1));
        countGetData += 1;
    }
}



//this method will execute when we pic an item from the spinner
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    if(country_spinner.getSelectedItem().toString().equals("Austria")){
        long itemId = country_spinner.getSelectedItemId();
        getData("getStates","countryId",itemId);
        state_spinner.setAdapter(new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, results));
    }
    else{
        long itemId = country_spinner.getSelectedItemId();
        getData("getStates","countryId",itemId);
        state_spinner.setAdapter(new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, results));
    }


}
}

有一个PHP API,它根据url返回Country,State或City的json。例如:     http://www.example.com/location_api/api.php?type=getCountries http://www.example.com/location_api/api.php?type=getStates&countryId=12 http://www.example.com/location_api/api.php?type=getCities&stateId=1

onItemSelected 中,我正在尝试相对于前一个微调器动态设置微调器。例如,只要选择国家/地区微调器项目,我就会设置状态微调器。我正在通过 if-else 块查看此内容;如果条件检查是否奥地利(列表中的一个国家/地区;随机选择),则设置状态微调器其他也设置状态微调。这样我最终根据country spinner元素设置状态微调器。

要向API指定选择国家/地区,我正在使用itemId,其中包含国家/地区微调器中所选项目的ID。 long itemId = country_spinner.getSelectedItemId();

然后当我有Id时,我调用 getData 方法设置结果 ArraryList并将其分配给微调器状态。< / p>

getData("getStates","countryId",itemId); state_spinner.setAdapter(new ArrayAdapter<String>(getActivity().getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, results));

以上代码使应用程序在运行时崩溃并出现以下错误(我认为其中只有一部分可能有用,完整的Logcat文件在这里:Link):

  

---------崩溃开始04-13 21:05:09.782 9288-9600 / com.gouravchawla.loginregistration E / AndroidRuntime:FATAL   EXCEPTION:Thread-503                                                                                    流程:com.gouravchawla.loginregistration,PID:9288                                                                                    java.lang.NegativeArraySizeException:-110                                                                                        在   com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:316)                                                                                        在   com.android.volley.toolbox.DiskBasedCache.get(DiskBasedCache.java:117)                                                                                        在com.android.volley.CacheDispatcher.run(CacheDispatcher.java:101)

     

抛出OutOfMemoryError“无法分配1667853436字节   分配777786个空闲字节和381MB直到OOM“

4 个答案:

答案 0 :(得分:5)

在您的代码中,您必须更改微调器的适配器,例如依赖于其他微调器。

城市spinner适配器更改取决于状态spinner适配器 这样的 状态spinner适配器更改取决于国家/地区spinner适配器,

我已经编写了一个示例代码,可以演示如何实现这一目标,我编写了一个通用代码,其他人可以在阅读答案时理解,随意建议并根据您的要求进行更改。

代码也可以在Github上找到,另一个例子可以帮助您从其使用的网络JSONOkHttpGSON下载apache-common-io数据,code

public class SpinnerCountryActivity extends AppCompatActivity {

    private Spinner country_Spinner;
    private Spinner state_Spinner;
    private Spinner city_Spinner;

    private ArrayAdapter<Country> countryArrayAdapter;
    private ArrayAdapter<State> stateArrayAdapter;
    private ArrayAdapter<City> cityArrayAdapter;

    private ArrayList<Country> countries;
    private ArrayList<State> states;
    private ArrayList<City> cities;

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

        initializeUI();
    }

    private void initializeUI() {
        country_Spinner = (Spinner) findViewById(R.id.SpinnerCountryActivity_country_spinner);
        state_Spinner = (Spinner) findViewById(R.id.SpinnerCountryActivity_state_spinner);
        city_Spinner = (Spinner) findViewById(R.id.SpinnerCountryActivity_city_spinner);

        countries = new ArrayList<>();
        states = new ArrayList<>();
        cities = new ArrayList<>();

        createLists();

        countryArrayAdapter = new ArrayAdapter<Country>(getApplicationContext(), R.layout.simple_spinner_dropdown_item, countries);
        countryArrayAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
        country_Spinner.setAdapter(countryArrayAdapter);

        stateArrayAdapter = new ArrayAdapter<State>(getApplicationContext(), R.layout.simple_spinner_dropdown_item, states);
        stateArrayAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
        state_Spinner.setAdapter(stateArrayAdapter);

        cityArrayAdapter = new ArrayAdapter<City>(getApplicationContext(), R.layout.simple_spinner_dropdown_item, cities);
        cityArrayAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
        city_Spinner.setAdapter(cityArrayAdapter);

        country_Spinner.setOnItemSelectedListener(country_listener);
        state_Spinner.setOnItemSelectedListener(state_listener);
        city_Spinner.setOnItemSelectedListener(city_listener);

    }

    private AdapterView.OnItemSelectedListener country_listener = new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (position > 0) {
                final Country country = (Country) country_Spinner.getItemAtPosition(position);
                Log.d("SpinnerCountry", "onItemSelected: country: "+country.getCountryID());
                ArrayList<State> tempStates = new ArrayList<>();

                tempStates.add(new State(0, new Country(0, "Choose a Country"), "Choose a State"));

                for (State singleState : states) {
                    if (singleState.getCountry().getCountryID() == country.getCountryID()) {
                        tempStates.add(singleState);
                    }
                }

                stateArrayAdapter = new ArrayAdapter<State>(getApplicationContext(), R.layout.simple_spinner_dropdown_item, tempStates);
                stateArrayAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
                state_Spinner.setAdapter(stateArrayAdapter);
            }

            cityArrayAdapter = new ArrayAdapter<City>(getApplicationContext(), R.layout.simple_spinner_dropdown_item, new ArrayList<City>());
            cityArrayAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
            city_Spinner.setAdapter(cityArrayAdapter);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    };

    private AdapterView.OnItemSelectedListener state_listener = new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if (position > 0) {
                final State state = (State) state_Spinner.getItemAtPosition(position);
                Log.d("SpinnerCountry", "onItemSelected: state: "+state.getStateID());
                ArrayList<City> tempCities = new ArrayList<>();

                Country country = new Country(0, "Choose a Country");
                State firstState = new State(0, country, "Choose a State");
                tempCities.add(new City(0, country, firstState, "Choose a City"));

                for (City singleCity : cities) {
                    if (singleCity.getState().getStateID() == state.getStateID()) {
                        tempCities.add(singleCity);
                    }
                }

                cityArrayAdapter = new ArrayAdapter<City>(getApplicationContext(), R.layout.simple_spinner_dropdown_item, tempCities);
                cityArrayAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
                city_Spinner.setAdapter(cityArrayAdapter);
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    };

    private AdapterView.OnItemSelectedListener city_listener = new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    };

    private void createLists() {
        Country country0 = new Country(0, "Choose a Country");
        Country country1 = new Country(1, "Country1");
        Country country2 = new Country(2, "Country2");

        countries.add(new Country(0, "Choose a Country"));
        countries.add(new Country(1, "Country1"));
        countries.add(new Country(2, "Country2"));

        State state0 = new State(0, country0, "Choose a Country");
        State state1 = new State(1, country1, "state1");
        State state2 = new State(2, country1, "state2");
        State state3 = new State(3, country2, "state3");
        State state4 = new State(4, country2, "state4");

        states.add(state0);
        states.add(state1);
        states.add(state2);
        states.add(state3);
        states.add(state4);

        cities.add(new City(0, country0, state0, "Choose a City"));
        cities.add(new City(1, country1, state1, "City1"));
        cities.add(new City(2, country1, state1, "City2"));
        cities.add(new City(3, country1, state2, "City3"));
        cities.add(new City(4, country2, state2, "City4"));
        cities.add(new City(5, country2, state3, "City5"));
        cities.add(new City(6, country2, state3, "City6"));
        cities.add(new City(7, country2, state4, "City7"));
        cities.add(new City(8, country1, state4, "City8"));
    }

    private class Country implements Comparable<Country> {

        private int countryID;
        private String countryName;


        public Country(int countryID, String countryName) {
            this.countryID = countryID;
            this.countryName = countryName;
        }

        public int getCountryID() {
            return countryID;
        }

        public String getCountryName() {
            return countryName;
        }

        @Override
        public String toString() {
            return countryName;
        }


        @Override
        public int compareTo(Country another) {
            return this.getCountryID() - another.getCountryID();//ascending order
//            return another.getCountryID()-this.getCountryID();//descending  order
        }
    }

    private class State implements Comparable<State> {

        private int stateID;
        private Country country;
        private String stateName;

        public State(int stateID, Country country, String stateName) {
            this.stateID = stateID;
            this.country = country;
            this.stateName = stateName;
        }

        public int getStateID() {
            return stateID;
        }

        public Country getCountry() {
            return country;
        }

        public String getStateName() {
            return stateName;
        }

        @Override
        public String toString() {
            return stateName;
        }

        @Override
        public int compareTo(State another) {
            return this.getStateID() - another.getStateID();//ascending order
//            return another.getStateID()-this.getStateID();//descending order
        }
    }

    private class City implements Comparable<City> {

        private int cityID;
        private Country country;
        private State state;
        private String cityName;

        public City(int cityID, Country country, State state, String cityName) {
            this.cityID = cityID;
            this.country = country;
            this.state = state;
            this.cityName = cityName;
        }

        public int getCityID() {
            return cityID;
        }

        public Country getCountry() {
            return country;
        }

        public State getState() {
            return state;
        }

        public String getCityName() {
            return cityName;
        }

        @Override
        public String toString() {
            return cityName;
        }

        @Override
        public int compareTo(City another) {
            return this.cityID - another.getCityID();//ascending order
//            return another.getCityID() - this.cityID;//descending order
        }
    }
}

此代码使用三个数据模型类CountryStateCity,所有这些类都实现Comparable<T>,以便可以根据其中的ID对其实例进行排序List,您可能希望在此处使用Comprator<T>按字母顺序排序。

我已使用AdapterView.OnItemSelectedListener跟踪Spinner窗口小部件中可以更改后续微调器适配器的更改。

我添加了一些测试数据来演示代码是如何工作的

Country              Country1                   Country2  
                  ______|_____                 _____|_________
                  |           |               |               |
State          state1       state2         state3          state4
               __|___       ___|___        __|___          __|____
               |    |       |     |        |    |          |     |
City        city1 city2   city3 city4   city5 city6      city7 city8 

enter image description here

答案 1 :(得分:2)

尝试这种方式它将起作用

string.xml

<resources>



    <string name="app_name">Spinner</string>

    <string name="hello_world">Hello world!</string>

    <string name="title_activity_main">MainActivity</string>



    <string-array name="country_array">

    <item>India</item>

    <item>Pakisthan</item>

    <item>Sri Lanka</item>

    </string-array>

    <string-array name="city_india">

    <item>Mumbai</item>

    <item>Chennai</item>

    <item>Kolkata</item>

    <item>Bangalore</item>

    </string-array>

    <string-array name="city_pakisthan">

    <item>Karachi</item>

    <item>Lahore</item>

    <item>Faisalabad</item>

    <item>Rawalpindi</item>

    </string-array>

    <string-array name="city_srilanka">

    <item>Colombo</item>

    <item>Dehiwala-Mount Lavinia</item>

    <item>Moratuwa</item>

    <item>Kotte</item>

    </string-array>

    </resources>

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="left" >



<TextView

android:id="@+id/textView"

android:layout_width="130dp"

android:layout_height="50dp"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="15dp"

android:gravity="center"

android:text="Select County and City"

android:textSize="15dp"

/>



<Spinner

android:id="@+id/spinnerCountry"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/textView"

android:layout_centerHorizontal="true"

android:layout_marginTop="28dp"

android:entries="@array/country_array" />



<Spinner

android:id="@+id/spinnerCity"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/spinnerCountry"

android:layout_below="@+id/spinnerCountry"

android:layout_marginTop="42dp"

android:entries="@array/city_india" />



</RelativeLayout>

MainActivity.java

import android.app.Activity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.AdapterView;

    import android.widget.AdapterView.OnItemSelectedListener;

    import android.widget.ArrayAdapter;

    import android.widget.Spinner;



    public class MainActivity extends Activity implements OnItemSelectedListener {



     Spinner spinnerCountry, spinnerCity;



     @Override

     protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      spinnerCountry = (Spinner) findViewById(R.id.spinnerCountry);

      spinnerCity = (Spinner) findViewById(R.id.spinnerCity);

      spinnerCountry.setOnItemSelectedListener(this);

     }



     @Override

     public void onItemSelected(AdapterView<?> parent, View arg1, int pos,

       long arg3) {

      parent.getItemAtPosition(pos);

      if (pos == 0) {

       ArrayAdapter<CharSequence> adapter = ArrayAdapter

         .createFromResource(this, R.array.city_india,

           android.R.layout.simple_spinner_item);

       spinnerCity.setAdapter(adapter);

      } else if (pos == 1) {

       ArrayAdapter<CharSequence> adapter = ArrayAdapter

         .createFromResource(this, R.array.city_pakisthan,

           android.R.layout.simple_spinner_item);

       spinnerCity.setAdapter(adapter);

      } else if (pos == 2) {

       ArrayAdapter<CharSequence> adapter = ArrayAdapter

    .createFromResource(this, R.array.city_srilanka,

           android.R.layout.simple_spinner_item);

       spinnerCity.setAdapter(adapter);

      }

     }



     @Override

     public void onNothingSelected(AdapterView<?> arg0) {

     }

    }

答案 2 :(得分:0)

我有一个类似的问题,原因是onItemSelected,在创建微调器时调用,而不是用户选择它。解决方法是通过spinner的post事件上的runnable添加监听器。这是一个例子: -

        // Set Spinner's onItemSelectedListener ie to act when a shop is selected.
        // Note!!! run on post, as a runnable, so that initial onItemSelected event
        // (at initialisation) is not captured
        current_shoplistspinner.post(new Runnable() {
            @Override
            public void run() {
                current_shoplistspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){

                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        currentshoplistcursor.moveToPosition(position);
                        currentshopid = currentshoplistcursor.getLong(ShopperDBHelper.SHOPS_COLUMNN_ID_INDEX);
                        Log.d(Constants.LOG,"ACTIVITY: " + THIS_ACTIVITY + " SECTION: Running - SHOPLIST OnItemSelectedLIstener" +
                                "- SHOPID Extracted=" + currentshopid);
                        currentaislelistcursor = shopperdb.getAislesPerShopAsCursor(currentshopid);
                        current_aislelistspinneradapter.swapCursor(currentaislelistcursor);
                        // if no aisles for this shop then don't show any products
                        // TODO dialog to allow Aisle Add
                        Log.d(Constants.LOG,"ACTIVITY: " + THIS_ACTIVITY + " SECTION: Running - SHOPLIST OnItemSelectedListener" +
                        "- NEW AISLE COUNT=" + currentaislelistcursor.getCount());
                        if(currentaislelistcursor.getCount() < 1) {
                            currentproductlistcursor = shopperdb.getNoProductsAsCursor();
                            current_productlistspinneradapter.swapCursor(currentproductlistcursor);
                            // Also need to clear products per aisle as no ailse so no products
                            // So use -1 as the aisleid when getting new cursor
                            currentproductsperaisleecursor = shopperdb.getProductsperAisle(-1);
                            current_productsperaislecursoradapter.swapCursor(currentproductsperaisleecursor);
                            // Disable the ADD button as cannot add if no aisle or prodcuts
                            findViewById(R.id.productusageedit_add).setVisibility(View.INVISIBLE);
                        } else {
                            currentproductlistcursor = shopperdb.getProductsAsCursor();
                            current_productlistspinneradapter.swapCursor(currentproductlistcursor);
                            findViewById(R.id.productusageedit_add).setVisibility(View.VISIBLE);
                            //Note!! as aislelist spinner has a new selecteditem it's listener will
                            //handle products per aisle refresh (unlike if no aisle)
                        }
                    }
                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                    }
                });
            }
        });

巧合的是来自3个旋转器(商店,过道和产品)。哪个会相似。请注意,这只是三者中的一个。我使用的逻辑是如果商店更改(即onItemSelected)然后更改过道(不需要更改商店列表,因为所有商店都在列表中),这将导致产品被更改。如果过道发生变化,则更改产品。

答案 3 :(得分:0)

在MainActivity.java文件中,您需要在onItemSelected方法下进行更改,在“国家/地区选择”中,需要获取country_id以检索国家/地区的州名。在状态更改时,请获取state_id以检索该州的城市名称,因为我认为所有这些详细信息都存储在MySQL的三个表中,并使用它们的ID进行关联。[我曾用volley android库从远程或本地数据库中检索数据并存储到Array中就像您在代码中使用的一样]

我已经开发了一个简单的程序来帮助您解决问题,我使用ArrayAdapter和ArrayList编写了一个简单的代码来存储Country,State和City。您还在代码中使用相同的代码。您可以根据需要更改提供的解决方案。

完整代码和部署指南可在Github

上找到

You can view this Output Screen that depicts how Country , State and City will appear

//结帐以下代码

公共类MainActivity扩展了AppCompatActivity {

//Spinner to hold Country, State/Province, City
private Spinner mSpinCountry,mSpinState,mSpinCity;

// To hold country response from getCountry.php API
private JSONArray countryResult;

// To hold state response from getState.php API
private JSONArray stateResult;

// To hold city response from getCity.php API
private JSONArray cityResult;


//To hold all country
private ArrayList<String> countryArrayList;

//To hold all state of the country
private ArrayList<String> stateArrayList;

//To hold all scity of the state
private ArrayList<String> cityArrayList;

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

    //Initialize country, state and city spinner
    mSpinCountry=(Spinner)findViewById(R.id.spinCountry);
    mSpinState=(Spinner)findViewById(R.id.spinState);
    mSpinCity=(Spinner)findViewById(R.id.spinCity);

    //Initialize Country Array List
    countryArrayList = new ArrayList<String>();


    //Fetch all Country
    getCountry();


    //On Country Change, Change List of State of the country
    mSpinCountry.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {

            //fetch Country_ID of the selected country to fetch list of states
            getCountryId(position);

        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

    mSpinState.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
            //fetch State_ID of the selected country to fetch list of states
            getStateId(position);

        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

}

private void getCountry() {
    StringRequest stringRequest = new StringRequest(BASE_URL+"getCountry.php",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    JSONObject j = null;
                    try {
                        j = new JSONObject(response);
                        countryResult = j.getJSONArray("result");

                        //Fetch Country List
                        countryDetails(countryResult);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplication(), ""+error,Toast.LENGTH_LONG).show();
                }
            });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}
private void countryDetails(JSONArray result) {
    for (int i = 0; i < result.length(); i++) {
        try {
            JSONObject json = result.getJSONObject(i);
            countryArrayList.add(json.getString(countryArray));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    mSpinCountry.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, countryArrayList));

}
private void getCountryId(int position) {
    String country_id="";
    try {
        //Getting object of given index
        JSONObject json = countryResult.getJSONObject(position);
        //Fetching name from that object
        country_id= json.getString("country_id");

        getState(country_id);
    } catch (JSONException e) {
        e.printStackTrace();
    }

}
private void getState(String country_id) {
    StringRequest stringRequest = new StringRequest(BASE_URL+"getState.php/?country_id="+country_id,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    JSONObject j = null;
                    try {
                        j = new JSONObject(response);
                        stateResult = j.getJSONArray("result");
                        stateDetails(stateResult);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplication(), ""+error,Toast.LENGTH_LONG).show();
                }
            });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);

}

private void stateDetails(JSONArray result) {

    //Create stateArrayList object here, because after each change of country state must be added (NOT Appended)
    stateArrayList=new ArrayList<String>();

    for (int i = 0; i < result.length(); i++) {
        try {
            JSONObject json = result.getJSONObject(i);
            stateArrayList.add(json.getString(stateArray));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
   // stateArrayList.add(0,"Select State");
    mSpinState.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, stateArrayList));

}

private void getStateId(int position) {

    String state_id="";
    try {
        //Getting object of given index
        JSONObject json = stateResult.getJSONObject(position);
        //Fetching name from that object
        state_id= json.getString("state_id");
        getCity(state_id);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

private void getCity(String state_id) {

    StringRequest stringRequest = new StringRequest(BASE_URL+"getCity.php/?state_id="+state_id,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    JSONObject j = null;
                    try {
                        j = new JSONObject(response);
                        cityResult = j.getJSONArray("result");
                        cityDetails(cityResult);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplication(), ""+error,Toast.LENGTH_LONG).show();
                }
            });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);

}

private void cityDetails(JSONArray cityResult) {
    //Create cityArrayList object here, because after each change of state city must be added (NOT Appended)
    cityArrayList=new ArrayList<String>();

    for (int i = 0; i < cityResult.length(); i++) {
        try {
            JSONObject json = cityResult.getJSONObject(i);
            cityArrayList.add(json.getString(cityArray));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    mSpinCity.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, cityArrayList));


}

}