Как обновить дочерний AutocompleteTextView в многоуровневом раскрывающемся списке - PullRequest
0 голосов
/ 12 октября 2019

Я хочу обновить второй список массивов AutocompleteTextView после нажатия первого. Но как-то он не обновляет список, пока я не нажму дважды.

Я работаю над проектом Android, я установил два AutocompleteTextViewОдин из элементов содержит Location, а второй содержит информацию о sub-location. Я установил основные местоположения локально на APP, и я хочу обновить второй список предложений после нажатия на первый. Проблема, с которой я столкнулся, заключается в том, что, когда я нажимаю на первую, я вижу, что я успешно вызываю веб-службу, и могу регистрировать возвращенный массив json, но каким-то образом массив-адаптер не обновляется новым списком. Когда янажмите в первый раз, похоже, что адаптер все еще содержит предыдущий список. Когда я дважды щелкаю одну и ту же опцию, я вижу, что дочерний выпадающий список обновляется. похоже, что задержка в обновлении задерживается, но почему-то я не могу понять, почему это происходит.

public class MainActivity extends AppCompatActivity {

AutoCompleteTextView CityTextView;
AutoCompleteTextView DistrictTextView;
public JSONArray jSonDist;
public ArrayAdapter districtAdapter;
public List<String> districtList;
private JSONArray configuredResponse;
private String CityName,District;

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

    if (android.os.Build.VERSION.SDK_INT > 9)
    {
        StrictMode.ThreadPolicy policy = new
                StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
    String[] Cities ={"CITY1","CITY2"};
    ArrayAdapter<String> adapter = new ArrayAdapter<>
            (this,android.R.layout.select_dialog_item,Cities);
    CityTextView=findViewById(R.id.PosCityDropdown);
    CityTextView.setAdapter(adapter);

    CityTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            CityName = CityTextView.getText().toString();
            DistrictTextView = findViewById(R.id.PosDistrictDropdown);
            JSONArray DistrictArray=getCOnfiguredLocation(getApplicationContext(),CityName);

            List<String> DistrictList=getListWards(DistrictArray);

            districtAdapter = new ArrayAdapter<>(MainActivity.this, R.layout.support_simple_spinner_dropdown_item, DistrictList);
            DistrictTextView.setAdapter(districtAdapter);

        }
    });


}

private JSONArray getCOnfiguredLocation(Context mContext, String CityValue) {
    final StringRequest Jsonarray= new StringRequest
            (Request.Method.POST, "URL", new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    tzdistrictAdapter.notifyDataSetChanged();
                    try {
                        configuredResponse= new JSONArray(response);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    districtList=getListWards(configuredResponse);

                    // JsonList=getListWards(jSonDist);
                    // Toast.makeText(getApplicationContext(), "Response From the server: "+getListWards(jSonDist), Toast.LENGTH_LONG).show();
                    Log.d("ResponseCode", response);
                }
            }, 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_LONG).show();
                }
            })
    {
        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String>  data = new HashMap<String, String>();
            data.put("name",CityName);
            data.put("level","2");
            return data;
        }
    };
    // Access the RequestQueue through your singleton class.
    PvsVolley.getInstance(this).addToRequestQueue(Jsonarray);
    return configuredResponse;
}

public List<String> getListWards(JSONArray Wards)
{
    List<String> ListWards = new ArrayList<>();
    if (Wards!=null) {
        for (int j = 0; j < Wards.length(); j++) {
            String wardone = null;
            try {
                wardone = Wards.getString(j);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            ListWards.add(wardone);
        }
    }
    else {
        ListWards.add(District);
    }
    return  ListWards;
}

}

Я ожидал результатов от вызова сети Volley (я используюкласс singleton для выполнения сетевого вызова), который будет показываться вам каждый раз, когда я изменяю первый выбор, скажем, City1 или City2, но этого не происходит, кажется, что список обновляется при втором выборе, что не годится для пользовательского опыта

...