Android 스피너 위젯에서 하나의 항목을 숨기는 방법을 찾고 있습니다. 이렇게하면 항목을 선택하지 않은 상태에서 스피너를 시뮬레이션 할 수 있으며 선택된 모든 항목에 대해 onItemSelected () 콜백이 항상 호출됩니다 (숨겨진 항목이 "현재"항목 인 경우). 일반적으로 콜백을 생성하지 않는 스피너에는 항상 하나의 항목, 즉 현재 항목이 있습니다.
항목을 비활성화 (회색으로 표시)하는 방법에 대한 일부 코드가 stackoverflow에 있지만 존재하지 않는 것처럼 항목을 완전히 숨기는 방법은 아닙니다.
많은 실험 끝에 다양한 구형 및 신규 Android 플랫폼에서 작동하는 다소 해킹 같은 솔루션을 찾았습니다. 눈에 띄지 않는 사소한 외관상의 단점이 있습니다. "스피너를 사용하지 마십시오"라는 것 외에 더 공식적인 솔루션에 대해 듣고 싶습니다.
이것은 항상 스피너의 첫 번째 항목을 숨기지 만 임의의 항목이나 둘 이상의 항목을 숨기도록 상당히 쉽게 확장 할 수 있습니다. 스피너 항목 목록의 시작 부분에 빈 문자열이 포함 된 더미 항목을 추가합니다. 스피너 대화 상자가 열리기 전에 현재 스피너 선택을 항목 0으로 설정할 수 있습니다. 이렇게하면 선택되지 않은 스피너가 시뮬레이션됩니다.
ArrayAdapter 메서드 재정의를 사용한 Spinner 설정 예 :
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
tv.setVisibility(View.GONE);
라인은 불필요 하다고 생각합니다 . 주석 처리는 적어도 Android 4.4.2 / KitKit (LG / Google Nexus 4에서)에서는 (시각적) 차이가없는 것 같습니다.
setTag(1)
위치 0의 textView에서 사용한 다음 convertView.getTag() != null
재사용 된 뷰가 위치 0에 대해 생성 된 0 높이 뷰인지 또는 다른 스피너 항목에 사용되는 일반 뷰인지 확인하는 데 사용되었습니다. 이것은 super.getDropDownView(position, convertView, parent)
항상 새로운 뷰를 만드는 대신 가끔 사용할 수 있기 때문 입니다.