'드롭 다운 상태'와 '닫힌 상태'의 레이아웃이 다른 Android Spinner?
내 레이아웃에 Android Spinner보기가 있습니다. 해당 스피너를 닫을 때 하나의 텍스트 항목 만 표시하고 싶지만 사용자가 해당 항목을 클릭하면 (즉, 스피너 대화 상자를 열 때) 아이콘 및 추가 설명 텍스트보기를 포함하여 각 항목에 대해 더 광범위한 정보를 표시하고 싶습니다. . 이제 스피너는 두 상태에서 매우 동일한 레이아웃 (아이콘, 제목 + 설명)을 표시합니다.
ArrayAdapter를 스피너에 연결하면 "setDropDownViewResource"라는 항목에 액세스 할 수 있지만, 제 스피너 데이터는 모든 종류의 배열이 아닌 커서에서 가져 오기 때문에 반드시 필요한 것은 아닙니다. , BaseAdapter를 확장하여 내 자신의 어댑터를 만들었습니다).
나를 도울 수있는 사람이 있습니까?
Adapter
Spinner에 대한 사용자 지정 클래스 를 만들고 getView()
일반 닫힌보기와 getDropDownView()
드롭 다운 목록보기에 대해 두 가지 메서드 를 덮어 써야 합니다. 두 메서드 모두 View
단일 요소에 대한 개체를 반환해야합니다 .
이 자습서를 살펴보면 시작하는 데 도움이 될 수 있습니다.
나도 문제가 있었다. 클래스를 재정의하는 대신이 작업을 수행하는 더 쉬운 방법이 있습니다.
그러나 먼저 어댑터 생성자의 리소스 ID와 .NET의 다른 리소스 ID 간의 차이점을 이해해야합니다 setDropDownViewResource(...)
. 예를 들면
SimpleAdapter adapter =
new SimpleAdapter(ab.getThemedContext(), data, R.layout.actionbar_dropdown, new String[] { "EventID", "Icon" },
new int[] { R.id.event_id, R.id.icon });
adapter.setDropDownViewResource(R.layout.actionbar_list_item);
R.layout.actionbar_dropdown
spinner 및 R.layout.actionbar_list_item
모든 단일 목록 항목 의 스타일입니다 .
ArrayAdapter를 사용하면 xml은 단일 TextView 만 될 수 있기 때문에 여기에서 SimpleAdapter를 사용했습니다.
R.layout.actionbar_list_item
ID가 인 TextView event_id
및 ID가 인 ImageView를 포함합니다 icon
.
R.layout.actionbar_dropdown
와 거의 똑같지 actionbar_list_item
만 후자의 ImageView 가시성은 GONE 으로 설정되어 있습니다.
이런 식으로 모든 목록 항목에는 텍스트보기와 이미지보기가 있지만 스피너에는 텍스트보기 만 표시됩니다.
Flo에 연결된 자습서의 코드를 사용하여 두 개의 다른 문자열 집합을 표시하기 위해 다음 CustomSpinnerAdapter를 만들었습니다. 하나는 항목이 표시 될 때 하나는 표시되지 않을 때 하나입니다. 누군가에게 도움이되기를 바랍니다.
public class CustomSpinnerAdapter extends ArrayAdapter<String> {
Context mContext;
int mTextViewResourceId;
String[] mObjects;
String[] mShortNameObjects;
public CustomSpinnerAdapter(Context context, int textViewResourceId,
String[] objects, String[] shortNameObjects) {
super(context, textViewResourceId, objects);
mContext = context;
mTextViewResourceId = textViewResourceId;
mObjects = objects;
mShortNameObjects = shortNameObjects;
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
row.setText(mObjects[position]);
return row;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
row.setText(mShortNameObjects[position]);
return row;
}
}
그리고 Fragment 내부 의 사용법 :
CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names));
마지막으로 스피너 항목의 레이아웃 :
spinner_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18dip"
android:gravity="left"
android:textColor="@color/navdraw_list_item_background_default"
android:padding="5dip" />
대체 레이아웃으로 드롭 다운보기 리소스 만 설정합니다.
ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER);
genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown);
view.setAdapter(genderAdapter);
For me, it's only a layout with an extra padding left, because my background of spinner is a rounded drawable and require this extra space.
Just call setUpSpinner() method after getting reference to spinner
// here is setUpSpinner method
private void setupSpinner() {
// Create adapter for spinner. The list options are from the String array it will use
// the spinner will use the default layout
ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(this,
R.array.array_dropdown_options, android.R.layout.simple_spinner_item);
// Specify dropdown layout style - simple list view with 1 item per line
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
// Apply the adapter to the spinner
spinner.setAdapter(spinnerAdapter);
// spinner is referenced spinner by finViewById.
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selection = (String) parent.getItemAtPosition(position);
if (!TextUtils.isEmpty(selection)) {
if (selection.equals(getString(R.string.item_a))) {
// your code for selected item whose id equals to id to R.string.item_a
} else if (selection.equals(getString(R.string.item_b))) {
// your code
} else {
// your code
}
}
}
// Because AdapterView is an abstract class, onNothingSelected must be defined
@Override
public void onNothingSelected(AdapterView<?> parent) {
// code for nothing selected in dropdown
}
});
}
'Development Tip' 카테고리의 다른 글
Emacs에서 줄 바꿈하는 방법? (0) | 2020.12.03 |
---|---|
PowerShell 스크립트의 파일 시스템 위치를 어떻게 얻을 수 있습니까? (0) | 2020.12.03 |
뷰의 요소를 반복하는 방법 (0) | 2020.12.03 |
Vim : ctag 설정이 어렵습니다. (0) | 2020.12.03 |
null android를 반환하는 카메라 활동 (0) | 2020.12.03 |