개발 공부/Android / / 2018. 6. 26. 19:10

Custom Spinner 만들기_1

Custom Spinner는 TopView, DropView(DropDown)등을 내 임의에 맞게 변경하면서 


다양한 스피너를 만드는데 도움이 많이 됐다. 


생성 방법을 정리하고 나중에 github에 올릴 예정!

 


내가 작업하면서 썼던 Spinner 옵션은 아래와 같다 

<Spinner
android:gravity="center"
android:id="@+id/sp_workbook_display_setting"
android:layout_width="182dp"
android:layout_height="40dp"
android:spinnerMode="dropdown"
android:layout_marginRight="16dp"
android:dropDownVerticalOffset="50dp"
android:theme="@style/ThemeOverlay.AppCompat.Light"
android:src="@drawable/btn_white_gray_round_radius_5dp"
android:popupBackground="@android:color/transparent"
android:dropDownWidth="590dp"/>


dropDownVerticalOffset : DropDown의 Vertical위치를 조정할 수 있다. 

예를 들어 스피너 바로 밑이 아닌 간격을 두고 DropDown를 띄울 수 있다.


popupBackground : DropDown를 투명하게 띄울 수 있다. 

내 경우는 커스텀한 DropDown의 모양이 말풍선이라서 이 값을 투명하게 하고 

DropDown에 쓰는 Layout에 background(말풍선)를 줬다.


dropDownWidth : 이 값을 설정하지 않으면 DropDown에 쓸 Layout크기가 아무리 커도 스피너 크기에 맞게 띄워진다. 

스피너 크기와 상관없이 DropDown를 띄우고 싶어서 쓰게 되었다. 


src는 스피너의 모양을 변경하려는데 썼다. (화살표, 버튼모양의 스피너 ) 

검색으로는 나인패치로 한다고 하는데 우선 xml로 해본 상태. 원하는 모양으로 하려면 나인패치로 해야겠다. 


 


SpinnerCustomAdapter 생성하기 

public class ProblemDisplaySpinnerAdapter extends ArrayAdapter<String> implements SpinnerAdapter{
Context mContext;
LayoutInflater mInflater;
List<String>items;
int dropResource;
int topResource;
String topTitle;

public ProblemDisplaySpinnerAdapter(@NonNull Context context, int resource, @NonNull List<String> objects, String Title) {
super(context, resource, objects);
this.mContext = context;
this.mInflater = LayoutInflater.from(context);
this.items = objects;
this.topResource = resource;
this.topTitle = Title;

}
@Override
public int getCount() {
return items.size();
}

@Nullable
@Override
public String getItem(int position) {
return super.getItem(position);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return createTopView(position, convertView, parent); // top layout 설정
}

// DropDown Layout set
@Override
public void setDropDownViewResource(int resource) {
super.setDropDownViewResource(resource);
this.dropResource = resource;
}

@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return createDropView(position, convertView, parent);
}

// DropDown Set
private View createDropView(int position, View convertView, ViewGroup parent) {
final View view = mInflater.inflate(dropResource, parent, false);

return view;
}

// TopView Set
private View createTopView(int position, View convertView, ViewGroup parent) {
final View view = mInflater.inflate(topResource, parent, false);
TextView tv_title = (TextView) view.findViewById(R.id.tv_workbook_toolbar_title);
tv_title.setText(topTitle);

return view;
}


내가 구현한 스피너 형태는 

스피너의 item 1개 안에 custom한 layout을 넣는 구조다.

그래서 스피너를 누르면 여러개의 item이 아닌 한 item만 뜬다.



spinnerList = new ArrayList<>();
spinnerList.add("index1");
String setTitle = "정렬/보기 방식";
displaySpinnerAdapter = new ProblemDisplaySpinnerAdapter(getApplicationContext(),R.layout.item_workbook_display_spinner_top,spinnerList,setTitle);
displaySpinnerAdapter.setDropDownViewResource(R.layout.item_workbook_display_spinner_drop_down);
sp_workbook_display_setting.setAdapter(displaySpinnerAdapter);
sp_workbook_display_setting.setSelection(0);


spinner가 setAdapter을 할 때 가져오는 값들 


Context

List<String> items (크기를 1개로 고정) 

topview에 쓸 layout resource

spinner title 


serAdapter 이후 setDropDownViewResource를 호출해서 DropDown에 쓸 layout resource 세팅 




 


  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유