如何根据第一个选择填充自动完成的textview?

时间:2019-04-29 10:25:01

标签: android android-volley autocompletetextview

有2个自动完成的文本视图,一个用于城市,一个用于州。我希望当用户在自动完成文本视图中输入州时,然后根据状态选择,应该自动填充城市自动完成文本视图。就像电子商务应用程序一样,只要有人在地址部分输入邮政编码,就会自动填写城市和州,用户也可以选择。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    EditText edtxt_name_address, edtxt_email_address, edtxt_mobile_address, edtxt_alt_mob_address, edtxt_pincode, edtxt_addline1, edtxt_addline2;
    Button buttonSaveAddress;
    AutoCompleteTextView edtxt_city, edtxt_state;

    private static final String KEY_STATE = "state";
    private static final String KEY_CITIES = "cities";
    private ProgressDialog pDialog;
    private String cities_url = "http://api.androiddeft.com/cities/cities_array.json";

    final List<State> statesList = new ArrayList<>();
    final List<String> states = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edtxt_city = findViewById(R.id.edtxt_city);
        edtxt_state = findViewById(R.id.edtxt_state);

        loadStateCityDetails();

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, states);
        edtxt_state.setThreshold(1);//will start working from first character
        edtxt_state.setAdapter(adapter);//setting the adapter data into the AutoCompleteTextView
        //edtxt_city.setTextColor(Color.BLACK)

        edtxt_state.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            }

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

        buttonSaveAddress = findViewById(R.id.buttonSaveAddress);
        buttonSaveAddress.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveAddress();
            }
        });

    }

    private void loadStateCityDetails() {

        JsonArrayRequest jsArrayRequest = new JsonArrayRequest
                (Request.Method.GET, cities_url, null, new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray responseArray) {

                        try {
                            //Parse the JSON response array by iterating over it
                            for (int i = 0; i < responseArray.length(); i++) {
                                JSONObject response = responseArray.getJSONObject(i);
                                String state = response.getString(KEY_STATE);
                                JSONArray cities = response.getJSONArray(KEY_CITIES);
                                List<String> citiesList = new ArrayList<>();
                                for (int j = 0; j < cities.length(); j++) {
                                    citiesList.add(cities.getString(j));
                                }
                                statesList.add(new State(state, citiesList));
                                states.add(state);
                                Log.d("lskd", String.valueOf(statesList));
                                Log.d("lskd", String.valueOf(states));

                            }
                            } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //pDialog.dismiss();

                        //Display error message whenever an error occurs
                        Toast.makeText(getApplicationContext(),
                                error.getMessage(), Toast.LENGTH_SHORT).show();

                    }
                });

        // Access the RequestQueue through your singleton class.
        MySingleton.getInstance(this).addToRequestQueue(jsArrayRequest);
    }

    private void saveAddress() {


        if (TextUtils.isEmpty(city)) {
            edtxt_city.setError("Please enter your City");
            edtxt_city.requestFocus();
            return;
        }

        if (TextUtils.isEmpty(state)) {
            edtxt_state.setError("Please enter your State");
            edtxt_state.requestFocus();
            return;
        }

        Intent profile_next = new Intent(MainActivity.this, ProfileNextActivity.class);
        startActivity(profile_next);
    }
}

State.java

public class State {
    private String stateName;
    private List<String> cities;

    public State(String stateName, List<String> cities) {
        this.stateName = stateName;
        this.cities = cities;
    }

    public String getStateName() {
        return stateName;
    }

    public List<String> getCities() {
        return cities;
    }
}

2 个答案:

答案 0 :(得分:0)

州和城市之间存在一对多的关系,我不是特别了解自动填充的含义。如果要填充所选州的相关城市,请执行以下操作。

在您的edtxt_state.setOnItemSelectedListener

内部
edtxt_state.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                statesList.get(position).getCities(); //get your cities from selected state
                //set adapter or notify city list of your `edtxt_city` AutoCompleteTextView
            }

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

答案 1 :(得分:0)

尝试一下...

edtxt_state.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                List<String> cityList = statesList.get(position).getCities();
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, cityList);
                edtxt_city.setThreshold(1);//will start working from first character
                edtxt_city.setAdapter(adapter);

            }

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

在获取loadStateCityDetails();后将适配器设置在stateList

statesList.add(new State(state, citiesList));
states.add(state);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, states);
        edtxt_state.setThreshold(1);//will start working from first character
        edtxt_state.setAdapter(adapter);

编辑

edtxt_state.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                String selection = (String) parent.getItemAtPosition(position);
                int pos = -1;

                for (int i = 0; i < statesList.size(); i++) {
                    if (statesList.get(i).getStateName().equals(selection)) {
                        pos = i;
                        break;
                    }
                }


                ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.select_dialog_item, statesList.get(pos).getCities());
                edtxt_city.setThreshold(1);//will start working from first character
                edtxt_city.setAdapter(adapter);//setting the adapter data into the AutoCompleteTextView
            }
        });

您必须获得stateList

如上所述设置城市适配器