Android Spinner에서 한 항목을 숨기는 방법
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);
임의의 항목이나 둘 이상의 항목을 숨기려면 자체 어댑터를 구현하고 숨기고 숨기고 있습니다 (또는 배열 목록).
public class CustomAdapter extends ArrayAdapter<String> {
private int hidingItemIndex;
public CustomAdapter(Context context, int textViewResourceId, String[] objects, int hidingItemIndex) {
super(context, textViewResourceId, objects);
this.hidingItemIndex = hidingItemIndex;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View v = null;
if (position == hidingItemIndex) {
TextView tv = new TextView(getContext());
tv.setVisibility(View.GONE);
v = tv;
} else {
v = super.getDropDownView(position, null, parent);
}
return v;
}
}
그리고 항목 목록을 만들 때 사용자 지정 어댑터를 사용합니다.
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
int hidingItemIndex = 0;
CustomAdapter dataAdapter = new CustomAdapter(this, android.R.layout.simple_spinner_item, list, hidingItemIndex);
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
(코드를 테스트하지 않을 수 있습니다) 도움이되기를 바랍니다.
목록을 잘라서 목록 끝에있는 항목을 숨기는 것이 더 있습니다.
그러나 먼저 선택하여 스피너에 표시 할 다음 다음을 선택해야합니다.
List<String> list = new ArrayList<String>();
list.add("string1");
list.add("string2");
list.add("string3");
list.add("[Select one]");
final int listsize = list.size() - 1;
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list) {
@Override
public int getCount() {
return(listsize); // Truncate the list
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
mySpinner.setSelection(listsize); // Hidden item to appear in the spinner
스피너 드롭 다운에서 항목을 숨기려면 필요한 기준에 따라 숨겨야하는 항목의 위치를 전달해야합니다. 드롭 다운에서 선택한 항목을 숨기는 사용 사례에서이 작업을 수행했습니다.
public class CustomAdapter extends ArrayAdapter<String> {
private List<String> dates;
private int hideItemPostion;
public CustomAdapter (Context context, int resource, List<String> dates) {
super(context, resource,dates);
this.dates=dates;
}
public void setItemToHide(int itemToHide)
{
this.hideItemPostion =itemToHide;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View v = null;
if (position == hideItemPostion) {
TextView tv = new TextView(getContext());
tv.setVisibility(View.GONE);
tv.setHeight(0);
v = tv;
v.setVisibility(View.GONE);
}
else
v = super.getDropDownView(position, null, parent);
return v;
}}
그리고 어댑터 설정은 다음과 가변합니다.
final CustomAdapter dataAdapter = new CustomAdapter(this,R.layout.spinner_item,dates);
dataAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
spinner.setAdapter(dataAdapter);
dataAdapter.setItemToHide(0);
드롭 다운에서 일부 항목을 선택하면 위치도 변경해야합니다.
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, final int i, long l) {
dataAdapter.notifyDataSetChanged();
mEPGDateSelector.setSelection(i);
dataAdapter.setItemToHide(i);}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
관심을 끌기 위해 "Prompt"를 힌트로 사용하는 솔루션을 만들었습니다. 이 코드는를 위해 만들어 Xamarin.Android
졌지만 10 분 안에 완벽하게 Java로 포팅 될 수 있습니다. ArrayAdapter
0 인덱싱 또는 개수 인덱싱 항목을 소스 배열에 추가하지 않고 간단하게 사용하십시오 . SpinnerGeolocation.SelectedItemId
아무것도 선택하지 않은 경우 에도 -1로 설정 됩니다 ( hint
현재 항목 임).
public class ArrayAdapterWithHint<T>: ArrayAdapter<T>
{
protected bool HintIsSet = false;
protected int HintResource = 0;
public ArrayAdapterWithHint(Context context, int textViewResourceId,
T[] objects)
: base(context, textViewResourceId, objects)
{
}
public ArrayAdapterWithHint(Context context, int hintResource,
int textViewResourceId, T[] objects)
: base(context, textViewResourceId, objects)
{
HintResource = hintResource;
}
public ArrayAdapterWithHint(Context context, int textViewResourceId,
IList<T> objects)
: base(context, textViewResourceId, objects)
{
}
public ArrayAdapterWithHint(Context context, int hintResource,
int textViewResourceId, IList<T> objects)
: base(context, textViewResourceId, objects)
{
HintResource = hintResource;
}
public override View GetDropDownView(int position, View convertView,
ViewGroup parent)
{
if (HintIsSet)
return base.GetDropDownView(position + 1,
convertView, parent);
return base.GetDropDownView(position, convertView, parent);
}
public override View GetView(int position, View convertView,
ViewGroup parent)
{
if (!HintIsSet && parent is Spinner &&
!string.IsNullOrWhiteSpace((parent as Spinner).Prompt))
{
Insert((parent as Spinner).Prompt, 0);
HintIsSet = true;
(parent as Spinner).SetSelection(base.Count - 1);
}
if (HintIsSet && position >= base.Count - 1)
{
View hintView = base.GetView(0, convertView, parent);
if (hintView is TextView)
(hintView as TextView).SetTextAppearance(
Context, HintResource);
return hintView;
}
if (HintIsSet && position < base.Count - 1)
return base.GetView(position + 1, convertView, parent);
return base.GetView(position, convertView, parent);
}
public override long GetItemId(int position)
{
if (HintIsSet)
{
if (position >= base.Count - 1)
return -1;
return position;
}
return base.GetItemId(position);
}
public override int Count
{
get
{
return base.Count > 0 && HintIsSet ? base.Count - 1 : base.Count;
}
}
}
내 문제를 해결 한이 솔루션을 찾았습니다.
final Spinner mySpinner = (Spinner)findViewById(R.id.spinner_triptype);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.spinner_item, R.id.weekofday, triptype_initial);
final ArrayAdapter<String> adapter_temp = new ArrayAdapter<String>
(this,R.layout.spinner_item, R.id.weekofday, triptype_array);
mySpinner.setAdapter(adapter);
mySpinner.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// display your error popup here
if(flag_spinner_isFirst){
mySpinner.setAdapter(adapter_temp);
flag_spinner_isFirst = false;
}
v.onTouchEvent(event);
return true;
}
});
일단 항목이 필터링되면 Spinner에 추가하는 것이 안전하기 때문에 Spinner보다는 Array List에 유효성 검사를 두는 것이 더 낫다고 생각합니다.
나에게 가장 잘 맞는 또 다른 접근 방식은 새로운 빈 뷰 객체를 반환하는 것입니다. 이것은 배열 요소를 가지고 놀지 않기 때문에 상당히 깔끔한 접근 방식입니다.
어댑터 클래스 확장 만들기 ArrayAdapter
당신의 방법 안에
public View getView(int position, View convertView, ViewGroup parent) {
View row = getCustomView();
if(position==0) // put the desired check here.
{
row = new View(context);
}
}
return row;
}
이것은 매우 오래된 질문이지만 첫 번째 항목도 표시하지 않는 멋진 (아마도) 깨끗한 방법을 찾았습니다. @Romich의 답변에서 영감을 받아 첫 번째 항목을 건너 뛰는 유사한 논리를 추가했습니다.
이렇게하면 임의의 항목 수 (기본적으로 1 개)가 효과적으로 숨겨집니다. 코드는 렌더링 할 객체의 크기 만 실제보다 짧게보고하고 렌더링 할 항목의 인덱스를 변경하여 임의의 항목 수를 건너 뜁니다.
단순하게 유지하기 위해 현재 사용중인 임의 항목 목록 숨기기를 지원하는 솔루션을 제외했지만 코드를 약간만 수정하면 쉽게 관리 할 수 있습니다.
class ArrayAdapterCustom(context: Context, textViewResourceId: Int, vararg objects: String)
: ArrayAdapter<String>(context, textViewResourceId, objects) {
//Can skip first n items (skip 1 as default)
var hideFirstItemsCount = 1
override fun getCount(): Int {
return super.getCount() - hideFirstItemsCount
}
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
return super.getDropDownView(position + hideFirstItemsCount, convertView, parent)
}
}
참고 URL : https://stackoverflow.com/questions/9863378/how-to-hide-one-item-in-an-android-spinner
'IT' 카테고리의 다른 글
Youtube 비디오 소스를 HTML5 비디오 태그에 표시 하시겠습니까? (0) | 2020.08.22 |
---|---|
모든 nullable에 대한 C # 제네릭 형식 제약 조건 (0) | 2020.08.22 |
스트리밍 리소스가 RESTful 패러다임에 어떻게 처리합니까? (0) | 2020.08.22 |
이클립스에서 당신의 치료를 받으시나요? (0) | 2020.08.22 |
RESTful 서비스의 비 CRUD 작업 (0) | 2020.08.22 |