Android 微调器的逐步选择取决于选定的值
我有3个纺纱机,像那样互相依赖 类别1 类别2 类别3 当用户选择Category1时,2.spinner应显示该类别 类别1-1 类别1-2 类别1-3 和用户选择类别1-2,3。微调器应显示 类别1-1-1 类别1-1-2 类别1-1-3 我是这样实现的,但是太长了 因此,我想听听关于更高效代码的任何建议Android 微调器的逐步选择取决于选定的值,android,android-spinner,Android,Android Spinner,我有3个纺纱机,像那样互相依赖 类别1 类别2 类别3 当用户选择Category1时,2.spinner应显示该类别 类别1-1 类别1-2 类别1-3 和用户选择类别1-2,3。微调器应显示 类别1-1-1 类别1-1-2 类别1-1-3 我是这样实现的,但是太长了 因此,我想听听关于更高效代码的任何建议 你可以这样重构它。它仍然很长,因为它的一部分可以概括,但它更可读 图书活动 public class BookActivity extends AppCompatActivity {
你可以这样重构它。它仍然很长,因为它的一部分可以概括,但它更可读 图书活动
public class BookActivity extends AppCompatActivity {
Spinner sp1, sp2, sp3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
sp1 = (Spinner) findViewById(R.id.sp1);
sp2 = (Spinner) findViewById(R.id.sp2);
sp3 = (Spinner) findViewById(R.id.sp3);
initSpinner1();
}
private void initSpinner1() {
final List<String> list = new ArrayList<>();
list.add("Category1");
list.add("Category2");
list.add("Category3");
initSpinner(sp1, list, new SpinnerListener.Callback() {
@Override
public void onResult(String itemName) {
initSpinner2(itemName);
}
});
}
private void initSpinner2(String selectedCategory) {
final List<String> list = new ArrayList<>();
switch (selectedCategory) {
case "Category1":
list.add("Category1-1");
list.add("Category1-2");
list.add("Category1-3");
break;
case "Category2":
list.add("Category2-1");
list.add("Category2-2");
list.add("Category2-3");
break;
case "Category3":
list.add("Category3-1");
list.add("Category3-2");
list.add("Category3-3");
break;
default:
break;
}
initSpinner(sp2, list, new SpinnerListener.Callback() {
@Override
public void onResult(String itemName) {
initSpinner3(itemName);
}
});
}
public void initSpinner3(String selectedCategory) {
final List<String> list = new ArrayList<>();
switch (selectedCategory) {
case "Category1-1":
list.add("Category1-1-1");
list.add("Category1-1-2");
list.add("Category1-1-3");
break;
case "Category1-2":
list.add("Category1-2-1");
list.add("Category1-2-2");
list.add("Category1-2-3");
break;
case "Category1-3":
list.add("Category1-3-1");
list.add("Category1-3-2");
list.add("Category1-3-3");
break;
default:
break;
}
initSpinner(sp3, list, new SpinnerListener.Callback() {
@Override
public void onResult(String itemName) {
// TODO
}
});
}
private void initSpinner(Spinner spinner, List<String> list, SpinnerListener.Callback callback) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
final AdapterView.OnItemSelectedListener listener = new SpinnerListener(this, callback);
spinner.setOnItemSelectedListener(listener);
}
}
可以这样写:
initSpinner(sp2, list, itemName -> initSpinner3(itemName));
甚至更短:
initSpinner(sp2, list, this::initSpinner3);
编辑
或者您可以通过使用字符串数组而不是列表来执行类似操作。您可以将初始化数组的方法导出到一个单独的文件中,以便使“活动”中的代码更轻松:
public class BookActivity extends AppCompatActivity {
Spinner sp1, sp2, sp3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
sp1 = (Spinner) findViewById(R.id.sp1);
sp2 = (Spinner) findViewById(R.id.sp2);
sp3 = (Spinner) findViewById(R.id.sp3);
initSpinner1();
}
private void initSpinner1() {
final String[] list = SpinnerArrayInitializer.getSpinner1Array();
initSpinner(sp1, list, itemName -> initSpinner2(itemName));
}
private void initSpinner2(String selectedCategory) {
final String[] list = SpinnerArrayInitializer.getSpinner2Array(selectedCategory);
initSpinner(sp2, list, itemName -> initSpinner3(itemName));
}
public void initSpinner3(String selectedCategory) {
final String[] list = SpinnerArrayInitializer.getSpinner3Array(selectedCategory);
initSpinner(sp3, list, itemName -> {
// TODO
});
}
private void initSpinner(Spinner spinner, String[] list, SpinnerListener.Callback
callback) {
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
final AdapterView.OnItemSelectedListener listener = new SpinnerListener(this, callback);
spinner.setOnItemSelectedListener(listener);
}
}
试试这个:
public class BookActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
private final static int SP1_NUM_OF_OPTIONS = 3;
private final static int SP2_NUM_OF_OPTIONS = 3;
private final static int SP3_NUM_OF_OPTIONS = 3;
private final static String SP3_HINT = "<SELECT>";
Spinner sp1, sp2, sp3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
sp1 = (Spinner) findViewById(R.id.sp1);
sp2 = (Spinner) findViewById(R.id.sp2);
sp3 = (Spinner) findViewById(R.id.sp3);
// Setup data list and adapter for sp1.
ArrayList<String> list = new ArrayList<>();
for(int i=1; i<=SP1_NUM_OF_OPTIONS; i++){
list.add("Category" + i);
}
ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp1.setAdapter(adapter);
// Set listeners for all spinners.
sp1.setOnItemSelectedListener(this);
sp2.setOnItemSelectedListener(this);
sp3.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(this, "YOUR SELECTION IS : " + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
fillSpinnerList(parent.getId(), parent.getItemAtPosition(position).toString());
// Automatically do something different after last step is selected.
if(parent.getId() == R.id.sp3){
if(!parent.getItemAtPosition(position).toString().equals(SP3_HINT)){
// Do something
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
public void fillSpinnerList(int spinnerId, String selectedSpinnerName){
ArrayAdapter adapter;
if(spinnerId == R.id.sp1){
String[] list1;
list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list1);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp2.setAdapter(adapter);
}else if(spinnerId == R.id.sp2){
ArrayList<String> list = new ArrayList<>();
list.add(SP3_HINT);
String[] list1;
list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
list.addAll(Arrays.asList(list1));
adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp3.setAdapter(adapter);
}
}
}
在strings.xml中添加您的类别:
<array name="Category1">
<item>Category1_1</item>
<item>Two</item>
<item>Three</item>
</array>
<array name="Category1_1">
<item>Category1_1_1</item>
<item>Category1_1_2</item>
<item>Category1_1_3</item>
</array>
<array name="Two">
<item>Category1_2_1</item>
<item>Category1_2_2</item>
<item>Category1_2_3</item>
</array>
<array name="Three">
<item>Category1_3_1</item>
<item>Category1_3_2</item>
<item>Category1_3_3</item>
</array>
<array name="Category2">
<item>Category2_1</item>
<item>Four</item>
<item>Five</item>
</array>
<array name="Category2_1">
<item>Category2_1_1</item>
<item>Category2_1_2</item>
<item>Category2_1_3</item>
</array>
<array name="Four">
<item>Category2_2_1</item>
<item>Category2_2_2</item>
<item>Category2_2_3</item>
<item>Category2_2_4</item>
</array>
<array name="Five">
<item>Category2_3_1</item>
<item>Category2_3_2</item>
<item>Category2_3_3</item>
<item>Category2_3_4</item>
<item>Category2_3_5</item>
</array>
<array name="Category3">
<item>Category3_1</item>
<item>Six</item>
<item>Seven</item>
</array>
<array name="Category3_1">
<item>Category3_1_1</item>
<item>Category3_1_2</item>
<item>Category3_1_3</item>
</array>
<array name="Six">
<item>Category3_2_1</item>
<item>Category3_2_2</item>
<item>Category3_2_3</item>
<item>Category3_2_4</item>
<item>Category3_2_5</item>
<item>Category3_2_6</item>
</array>
<array name="Seven">
<item>Category3_3_1</item>
<item>Category3_3_2</item>
<item>Category3_3_3</item>
<item>Category3_3_4</item>
<item>Category3_3_5</item>
<item>Category3_3_6</item>
<item>Category3_3_7</item>
</array>
希望能有帮助 我选择第二种方法,因为您可以使数组尽可能大,但不会影响逻辑活动的大小。如果你的数组真的很大,也许应该使用一些不同的东西来存储数据,比如数据库解决方案是OK,但我的实际数据不是Category1,Category1-1名称彼此不同,但谢谢。编辑了答案[fillSpinnerList方法中的更改]!在strings.xml中,您可以更改spinner2的项目名称,但请确保也相应地更改了数组名称。
public class BookActivity extends AppCompatActivity {
Spinner sp1, sp2, sp3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
sp1 = (Spinner) findViewById(R.id.sp1);
sp2 = (Spinner) findViewById(R.id.sp2);
sp3 = (Spinner) findViewById(R.id.sp3);
initSpinner1();
}
private void initSpinner1() {
final String[] list = SpinnerArrayInitializer.getSpinner1Array();
initSpinner(sp1, list, itemName -> initSpinner2(itemName));
}
private void initSpinner2(String selectedCategory) {
final String[] list = SpinnerArrayInitializer.getSpinner2Array(selectedCategory);
initSpinner(sp2, list, itemName -> initSpinner3(itemName));
}
public void initSpinner3(String selectedCategory) {
final String[] list = SpinnerArrayInitializer.getSpinner3Array(selectedCategory);
initSpinner(sp3, list, itemName -> {
// TODO
});
}
private void initSpinner(Spinner spinner, String[] list, SpinnerListener.Callback
callback) {
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
final AdapterView.OnItemSelectedListener listener = new SpinnerListener(this, callback);
spinner.setOnItemSelectedListener(listener);
}
}
public interface SpinnerArrayInitializer {
static String[] getSpinner1Array() {
return new String[]{"Category1", "Category2", "Category3"};
}
static String[] getSpinner2Array(String selectedCategory) {
switch (selectedCategory) {
case "Category1":
return new String[]{"Category1-1", "Category1-2", "Category1-3"};
case "Category2":
return new String[]{"Category2-1", "Category2-2", "Category2-3"};
case "Category3":
return new String[]{"Category3-1", "Category3-2", "Category3-3"};
default:
return new String[0];
}
}
static String[] getSpinner3Array(String selectedCategory) {
switch (selectedCategory) {
case "Category1-1":
return new String[]{"Category1-1-1", "Category1-1-2", "Category1-1-3"};
case "Category1-2":
return new String[]{"Category1-2-1", "Category1-2-2", "Category1-2-3"};
case "Category1-3":
return new String[]{"Category1-3-1", "Category1-3-2", "Category1-3-3"};
default:
return new String[0];
}
}
}
public class BookActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
private final static int SP1_NUM_OF_OPTIONS = 3;
private final static int SP2_NUM_OF_OPTIONS = 3;
private final static int SP3_NUM_OF_OPTIONS = 3;
private final static String SP3_HINT = "<SELECT>";
Spinner sp1, sp2, sp3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
sp1 = (Spinner) findViewById(R.id.sp1);
sp2 = (Spinner) findViewById(R.id.sp2);
sp3 = (Spinner) findViewById(R.id.sp3);
// Setup data list and adapter for sp1.
ArrayList<String> list = new ArrayList<>();
for(int i=1; i<=SP1_NUM_OF_OPTIONS; i++){
list.add("Category" + i);
}
ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp1.setAdapter(adapter);
// Set listeners for all spinners.
sp1.setOnItemSelectedListener(this);
sp2.setOnItemSelectedListener(this);
sp3.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(this, "YOUR SELECTION IS : " + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
fillSpinnerList(parent.getId(), parent.getItemAtPosition(position).toString());
// Automatically do something different after last step is selected.
if(parent.getId() == R.id.sp3){
if(!parent.getItemAtPosition(position).toString().equals(SP3_HINT)){
// Do something
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
public void fillSpinnerList(int spinnerId, String selectedSpinnerName){
ArrayAdapter adapter;
if(spinnerId == R.id.sp1){
String[] list1;
list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list1);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp2.setAdapter(adapter);
}else if(spinnerId == R.id.sp2){
ArrayList<String> list = new ArrayList<>();
list.add(SP3_HINT);
String[] list1;
list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
list.addAll(Arrays.asList(list1));
adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp3.setAdapter(adapter);
}
}
}
<array name="Category1">
<item>Category1_1</item>
<item>Two</item>
<item>Three</item>
</array>
<array name="Category1_1">
<item>Category1_1_1</item>
<item>Category1_1_2</item>
<item>Category1_1_3</item>
</array>
<array name="Two">
<item>Category1_2_1</item>
<item>Category1_2_2</item>
<item>Category1_2_3</item>
</array>
<array name="Three">
<item>Category1_3_1</item>
<item>Category1_3_2</item>
<item>Category1_3_3</item>
</array>
<array name="Category2">
<item>Category2_1</item>
<item>Four</item>
<item>Five</item>
</array>
<array name="Category2_1">
<item>Category2_1_1</item>
<item>Category2_1_2</item>
<item>Category2_1_3</item>
</array>
<array name="Four">
<item>Category2_2_1</item>
<item>Category2_2_2</item>
<item>Category2_2_3</item>
<item>Category2_2_4</item>
</array>
<array name="Five">
<item>Category2_3_1</item>
<item>Category2_3_2</item>
<item>Category2_3_3</item>
<item>Category2_3_4</item>
<item>Category2_3_5</item>
</array>
<array name="Category3">
<item>Category3_1</item>
<item>Six</item>
<item>Seven</item>
</array>
<array name="Category3_1">
<item>Category3_1_1</item>
<item>Category3_1_2</item>
<item>Category3_1_3</item>
</array>
<array name="Six">
<item>Category3_2_1</item>
<item>Category3_2_2</item>
<item>Category3_2_3</item>
<item>Category3_2_4</item>
<item>Category3_2_5</item>
<item>Category3_2_6</item>
</array>
<array name="Seven">
<item>Category3_3_1</item>
<item>Category3_3_2</item>
<item>Category3_3_3</item>
<item>Category3_3_4</item>
<item>Category3_3_5</item>
<item>Category3_3_6</item>
<item>Category3_3_7</item>
</array>