gpt4 book ai didi

java - 通过引用多个 Spinner 的 setOnItemSelectedListener 来传递 String 变量

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:48 26 4
gpt4 key购买 nike

好的,我已经read around并看到 Java 仅按值传递,而不是按引用传递,所以我不知道如何完成此操作。

  • 我在一个 Android Activity 中有 6 个微调器,它们填充了不同的 SQLite 查询。
  • 填充每个 Spinner 和设置 OnItemSelectedListener 的代码非常相似,因此我希望重构为一个方法并使用每个 Spinner ID 和 Sqlite 查询调用它 6 次。
  • 如何让 Spinner onItemSelectedListener 更改每个不同 Spinner 上的正确实例成员?

    public void fillSpinner(String spinner_name, final String field_name) {
    // This finds the Spinner ID passed into the method with spinner_name
    // from the Resources file. e.g. spinner1
    int resID = getResources().getIdentifier(spinner_name, "id",
    getPackageName());
    Spinner s = (Spinner) findViewById(resID);
    final Cursor cMonth;
    // This gets the data to populate the spinner, e.g. if field_name was
    // strength = SELECT _id, strength FROM cigars GROUP BY strength
    cMonth = dbHelper.fetchSpinnerFilters(field_name);
    startManagingCursor(cMonth);
    String[] from = new String[] { field_name };
    int[] to = new int[] { android.R.id.text1 };
    SimpleCursorAdapter months = new SimpleCursorAdapter(this,
    android.R.layout.simple_spinner_item, cMonth, from, to);
    months.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s.setAdapter(months);
    // This is setting the Spinner Item Selected Listener Callback, where
    // all the problems happen
    s.setOnItemSelectedListener(new OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> parent, View view,
    int position, long id) {
    Cursor theCursor = (Cursor) parent.getSelectedItem();
    // This is the problem area.
    object_reference_to_clas_member_of_field_name = theCursor
    .getString(theCursor.getColumnIndex(field_name));
    }

    public void onNothingSelected(AdapterView<?> parent) {
    // showToast("Spinner1: unselected");
    }
    });

您可以像这样调用此方法 fillSpinner("spinner1","strength");

它找到 ID 为 spinner1 的微调器,并在数据库中查询 strength 字段。 field_name,在这个例子中是强度必须被声明为最终变量,以便在 onItemSelectedListener 中使用,否则我会得到错误 Cannot refer to a non-final variable field_name inside an inner class defined in a different method.

但是,当使用每个不同的 Spinner 时,如何让 onItemSelectedListener 更改不同实例成员的值?这是所有重要的代码行:object_reference_to_clas_member_of_field_name = theCursor .getString(theCursor.getColumnIndex(field_name));

我不能使用最终字符串,因为当用户选择不同的值时,变量显然会发生变化。我已经阅读了很多内容并且很难找到解决方案。我可以复制并粘贴此代码 6 次而忘记重构,但我真的很想知道优雅的解决方案。如果您不明白我的问题,请发表评论,我不确定我是否解释得很好。

最佳答案

你可以通过传递额外的类作为 fillSpinner 方法的参数来做到这一点:

一个。创建接口(interface)

public interface OnSpinnerValueSelected {
void onValueSelected(String selectedValue);
}

B.稍微改变一下你的方法:

public void fillSpinner(String spinner_name, final String field_name,
final OnSpinnerValueSelected valueChangeListener) {

// Prepare spinner

s.setOnItemSelectedListener(new OnItemSelectedListener() {

public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
Cursor theCursor = (Cursor) parent.getSelectedItem();

valueChangeListener.onValueSelected(theCursor
.getString(theCursor.getColumnIndex(field_name)));
}

public void onNothingSelected(AdapterView<?> parent) {

}
});
}

C.提供听众:

fillSpinner("spinner1","strength", new OnSpinnerValueSelected() {
public void onValueSelected(String selectedValue) {
yourObject.setField(selectedValue);
}
});

关于java - 通过引用多个 Spinner 的 setOnItemSelectedListener 来传递 String 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com