잡동사니

반응형

질문

내 앱에서 스피너를 사용하고 있으며 서버에서 가져 오는 데이터로 스피너를 채우고 있는데 Retrofit2를 네트워킹 라이브러리로 사용하고 있습니다. 내가 서버에서 가져 오는 두 가지 값이 있는데 하나는 상태 이름이고 다른 하나는 상태 ID입니다. Spinner에서는 상태 이름을 표시하고 있지만 선택 상태에서는 서버에서 가져온 해당 상태 이름 ID를 선택해야합니다 .In spinner state name 성공적으로 표시되지만 항목 위치가 아닌 POJO class에있는 해당 상태 이름 ID를 얻고 싶습니다.

아래는 내 코드입니다.

서버 응답은 다음과 같습니다.

{
"data": [
    {
        "id": "5",
        "name": "Bihar"
    },
    {
        "id": "7",
        "name": "Chhattisgarh"
    },
    {
        "id": "10",
        "name": "Delhi"
    }
],
"status": true,
"code": 200
} 

 

States.java

public class States {

@SerializedName("data")
@Expose
private List<AllStates> data = null;
@SerializedName("status")
@Expose
private Boolean status;
@SerializedName("code")
@Expose
private int code;

public States(){

}

public List<AllStates> getData() {
    return data;
}

public void setData(List<AllStates> data) {
    this.data = data;
}

public Boolean getStatus() {
    return status;
}

public void setStatus(Boolean status) {
    this.status = status;
}

public int getCode() {
    return code;
}

public void setCode(int code) {
    this.code = code;
}
}

AllStates.java

public class AllStates {

@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;

public AllStates(){

}

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;
}
}

CalenderFragment.java

public class CalendarFragment extends Fragment {

Spinner spinnerState;
List<AllStates> stateList = new ArrayList<>();
ArrayList<String> stateSpinnerList = new ArrayList<>();

public CalendarFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_calendar, container, false);

    spinnerState = view.findViewById(R.id.spinnerState);

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

            String item = parent.getItemAtPosition(position).toString();
            Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
        }

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

        }
    });

    Retrofit retrofit   = RetrofitClient.getInstance();
    ApiService apiService = retrofit.create(ApiService.class);

    apiService.allStates().subscribeOn(Schedulers.io())
                          .observeOn(AndroidSchedulers.mainThread())
                          .subscribe(new Observer<States>() {
                              @Override
                              public void onSubscribe(Disposable d) {

                              }

                              @Override
                              public void onNext(States states) {

                                 stateList = states.getData();

                                 stateSpinnerList.add("Select state");

                                 for(int i =0;i<stateList.size();i++){

                                     stateSpinnerList.add(stateList.get(i).getName());
                                 }

                                 ArrayAdapter<String> stateAdapter = new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1,stateSpinnerList);
                                 spinnerState.setAdapter(stateAdapter);
                              }

                              @Override
                              public void onError(Throwable e) {

                                  TastyToast.makeText(getActivity(),e.getMessage(),TastyToast.LENGTH_SHORT,
                                                           TastyToast.ERROR).show();
                              }

                              @Override
                              public void onComplete() {

                              }
                          });

    return view;
  }
}

누군가가 원하는 결과를 얻을 수있는 방법을 알려주십시오. 어떤 도움을 주시면 감사하겠습니다.

감사합니다


답변1

사용자 지정 어댑터를 사용하지 않으려면 선택한 스피너 위치를 가져오고 해당 위치를 사용하여 State 모델을 가져옵니다.

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
          //      int position = spinnerState.getSelectedItemPosition();

               if(position >= 1){
                   AllStates allStates = stateList.get(position - 1)  
               }
        }

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

        }
    });

이제 allStates 모델에서 id 에 액세스 할 수 있습니다.



답변2

그래서 내가 이해하는 것은 Spinner에서 상태를 선택하고 상태 이름을 가져오고 있지만 stateId를 얻고 싶다는 것입니다.

한 가지 가능한 해결책은 HashMap < StateName, StateId > 맵을 사용하는 것입니다.스피너에서 상태 이름을 받으면 map.get (name)을 호출하면 상태 ID를 얻을 수 있습니다.

편집하다:

다음과 같이 구현할 수 있습니다.

HashMap<String, Integer> map = new HashMap<>();
for(state in list){
   map.put(state.name, state.id);
}

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

            String name = parent.getItemAtPosition(position).toString();
            int id = map.get(name);
        }

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

        }
    });


 

 

 

 

출처 : https://stackoverflow.com/questions/63086853/how-to-get-spinner-value-after-item-select-in-spinner

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band