Android第二个微调器基于第一个微调器的选择而改变

时间:2012-04-27 05:15:51

标签: java android dynamic spinner

首先,是的,我已经浏览了一些可能的解决方案,他们已经让我接近但我错过了一些我在生活中找不到的小关键步骤。一切都很好。第一个微调器(类别)是应该填充的,我可以告诉第二个微调器(Color)通过create方法填充,但是当用户选择一个Category时,我错过了告诉它重新创建的位置。这是我现在所有的代码。

package yarn.pack.name;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.AdapterView.OnItemSelectedListener;

public class YarnDatabaseActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    try {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Spinner Category_Add_Spinner = Create_Category_Add_Spinner();
        Spinner Color_Add_Spinner = Create_Color_Add_Spinner(null);
    } catch (Exception e) {
        Log.e("ERROR", e.toString());
        e.printStackTrace();
    }
}

// Creates the Category Spinner for the Add section sends the choice made to
// a method for populating the color spinner
public Spinner Create_Category_Add_Spinner() {
    Spinner Category_Add_Spinner = (Spinner) findViewById(R.id.categoryAddID);
    String[] Category_Add_Spinner_Array = getResources().getStringArray(
            R.array.categoryNames);
    SpinnerAdapter Category_Add_Spinner_Adapter = new ArrayAdapter<String>(
            this, android.R.layout.simple_spinner_dropdown_item,
            Category_Add_Spinner_Array);
    Category_Add_Spinner.setAdapter(Category_Add_Spinner_Adapter);
    Category_Add_Spinner
            .setOnItemSelectedListener(new Category_Add_Spinner_Listener());
    return Category_Add_Spinner;
}

// The listener for the Category Spinner that sends whatever choice made to
// the method that populates the second spinner.
public class Category_Add_Spinner_Listener implements
        OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> Category_Add_Adapter_View,
            View v, int position, long row) {
        String Category_Add_Choice = Category_Add_Adapter_View
                .getItemAtPosition(position).toString();
        Create_Color_Add_Spinner(Category_Add_Choice);
    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

}

// Creates the Color Spinner for the Add section
public Spinner Create_Color_Add_Spinner(String category_Add_Choice) {
    String[] Color_Add_Spinner_Array = null;
    Spinner Color_Add_Spinner = (Spinner) findViewById(R.id.colorAddID);
    if (category_Add_Choice == "Red") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.RedColors);
    } else if (category_Add_Choice == "Pink") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.PinkColors);
    } else if (category_Add_Choice == "Orange") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.OrangeColors);
    } else if (category_Add_Choice == "Yellow") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.YellowColors);
    } else if (category_Add_Choice == "Green") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.GreenColors);
    } else if (category_Add_Choice == "Blue") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.BlueColors);
    } else if (category_Add_Choice == "Purple") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.PurpleColors);
    } else if (category_Add_Choice == "Neutral") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.NeutralColors);
    } else if (category_Add_Choice == "Mix") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.MixColors);
    } else if (category_Add_Choice == "Fleck") {
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.FleckColors);
    } else
        Color_Add_Spinner_Array = getResources().getStringArray(
                R.array.MixColors);     
    SpinnerAdapter Color_Add_Spinner_Adapter = new ArrayAdapter<String>(
            this, android.R.layout.simple_spinner_dropdown_item,
            Color_Add_Spinner_Array);
    Color_Add_Spinner.setAdapter(Color_Add_Spinner_Adapter);
    Color_Add_Spinner
            .setOnItemSelectedListener(new Color_Add_Spinner_Listener());
    return Color_Add_Spinner;
}
}

我很确定无论我错过什么都是愚蠢明显的东西,但我已经在这方面工作了很长时间,我的时间很短,我以为我会伸手去看看我能不能让一些光照在这个主题上。提前感谢您提供的所有帮助。


对于命名约定感到抱歉。我一般都这么说,这对我自己最有意义。无论如何,事实证明问题是我使用==而不是.equals 做出改变,它顺利运作!谢谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

您的代码几乎正常运行,并不是非常完美,但它可以快速运行:

  1. 从不使用==来比较java中的字符串。始终使用stringA.equals(stringB)。我想这是你唯一的问题。
  2. 尊重java命名约定,它会更容易阅读。
  3. 正如@Frankenstein所指出的,使用findViewById制作窗口小部件数据成员通常比使用布局重新获取它们更加清晰和有效。

答案 1 :(得分:0)

在活动级别声明此内容,

SpinnerAdapter Category_Add_Spinner_Adapter;

第二步,在最后的onItemSelected中添加这一行。

Category_Add_Spinner_Adapter.notifyDataSetChanged();

更改未在运行时反映,因为您只更改了Array的值,但适配器已经很久以前分配了数组。 因此,每当您更改数组/ arraylist中的值...以反映适配器中的这些更改时..您需要通知适配器底层数组的值是更改,请更新您的自己。