В AutoCompleteTextView применить к элементу нажмите listner всегда возвращает идентификатор как 1

#android #json #android-volley #autocompletetextview

#Android #json #android-volley #autocompletetextview

Вопрос:

Это мой ответ json :-

 {
  "ReplyCode": 1,
  "Message": "Franchisee and Plans List",
"data2": [
    {
      "StateId": 1,
      "StateName": "Andaman and Nicobar Island",
      "CountryId": 1
    },
    {
      "StateId": 2,
      "StateName": "Andhra Pradesh",
      "CountryId": 1
    },
    {
      "StateId": 3,
      "StateName": "Arunachal Pradesh",
      "CountryId": 1
    },
    {
      "StateId": 4,
      "StateName": "Assam",
      "CountryId": 1
    },
  

Это мой метод, с помощью которого я извлекаю данные из json :-

  public void volleyStatedata() {

        if (mGeneralUtilities.isConnected()) {
            mProgressDialog.show();
            StringRequest stateRequest = new StringRequest(Request.Method.POST, GlobalData.REGISTER_DATA_URL,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {


                            mProgressDialog.dismiss();

                            try {
                                JSONObject jsonObject = new JSONObject(response);
                                JSONArray jsonArray = jsonObject.getJSONArray("data2");
                                for (int i = 0; i < jsonArray.length(); i  ) {
                                    PojoState pojoState = new PojoState();
                                    JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                                    String stateId = jsonObject1.getString("StateId");
                                    String stateName = jsonObject1.getString("StateName");
                                    mStateList.add(stateName);
                                    mStateIdList.add(stateId);
                                    pojoState.setmStateId(stateId);
                                    pojoState.setmStatename(stateName);
                                    mpojoStateList.add(pojoState);


                                }


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

                            Log.e("error", ""   volleyError.getMessage());


                        }
                    }) {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {

                    Map<String, String> params = new HashMap<String, String>();


                    return params;
                }
            };

            RequestQueue stateQueue = Volley.newRequestQueue(getContext());

            stateQueue.add(stateRequest);
        } else {

            mGeneralUtilities.showAlertDialog("Hey User !", "Please connect to the internet", "Ok");

        }
    }
  

Это мой адаптер, в котором я устанавливаю его в autocompletetextview :-

  ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_1, mStateList);
        mActState.setAdapter(mAdapter);
        mActState.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                mpojoStateList.get(i).getmStateId();


            }
        });
  

Моя проблема в том, что autocompletetextview всегда возвращает идентификатор 1. я применяю к нему onitemclick listner. но он всегда получает идентификатор 1.я хочу, чтобы идентификатор соответствовал состоянию, указанному в моем json.Может кто-нибудь сказать мне, как я могу этого добиться??

Ответ №1:

Ваш код использует i возврат в onItemClick обратном вызове, который ссылается на элемент, который вы нажали из видимых элементов в списке автозаполнения, а не на ваш исходный список. Когда вы нажимаете на первый элемент в списке автозаполнения, i=0 , что означает, что он всегда возвращает элемент «Андаманские и Никобарские острова«, чей StateId=1 .

С моей точки зрения, вы можете получить строку элемента из mAdapter и сравнить ее со своей mpojoStateList и найти соответствующий элемент. (Проверьте пример кода)

     final ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_1, mStateList);
    mActState.setAdapter(mAdapter);
    mActState.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            String itemName = mAdapter.getItem(i);

            for (PojoState pojo : mpojoStateList) {
                if (pojo.mStateName.equals(itemName)) {
                    String id = pojo.getmStateId(); // This is the correct ID
                    break; // No need to keep looping once you found it.
                }
            }
        }
    });
  

Также лучше, если внутри вашего PojoState объекта вы переопределите свой toString() метод и заставите его возвращать mStateName , и передавать mpojoStateList адаптеру без необходимости делать 3 ArrayLists . Таким образом, mAdapter.getItem(i) PojoState вместо строки будет возвращен объект, и вы можете использовать его идентификатор, не обращаясь к возвращаемой позиции ( i ).