【问题标题】:How can I call an ArrayAdapter from another activity to delete item from ArrayAdapter with strings.xml array?如何从另一个活动中调用 ArrayAdapter 以使用 strings.xml 数组从 ArrayAdapter 中删除项目?
【发布时间】:2019-09-03 15:06:49
【问题描述】:

问题总结:适配器和微调器都在微调器Activity中。一旦用户选择了一个名称,它就会将它们发送到主活动。我想从另一个活动中调用一个 ArrayAdapter 并从该列表中删除一个项目,但似乎无法弄清楚如何这样做。我使用 ArrayAdapter 并从strings.xml 附加一个列表并使用string-array name="horizon_names"

Call custom ArrayAdapter method from another Activity 没有回答我的问题。

我尝试过的:我尝试过公开ArrayAdapter 并尝试在其他活动中调用它,但没有任何反应。

微调器选择活动:

public class SpinnerSelection extends AppCompatActivity implements 
AdapterView.OnItemSelectedListener {

Spinner spinner;
TextView tvPackage;
String stringSelectionPackage;
Button bSaveSelection;
Context context;
public ArrayAdapter<CharSequence> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_spinner_selection);
    context = this;

    //---------------------------------------------------
    // Name Selection (1-24)
    spinner = findViewById(R.id.spinner);
    tvPackage= findViewById(R.id.tvPackage);
    //Array Adapter for creating list
    adapter = ArrayAdapter.createFromResource(this, R.array.names, 
android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
    spinner.setAdapter(adapter);
    spinner.setOnItemSelectedListener(this);



    //Save Selection Button Code
    bSaveSelection = findViewById(R.id.bSaveSelection);
    bSaveSelection.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent myIntent = new Intent(view.getContext(), 
MainActivity.class);
            stringSelectionPackage= 
tvPackage.getText().toString();
            myIntent.putExtra("name", stringSelectionPackage);
            startActivity(myIntent);
            finish();
        }
    });

}

@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, 
long l) {
    //Put user selection into String text
    String text = adapterView.getItemAtPosition(i).toString();
    //Store text in tvPackage to send it to MainActivity and 
place in @id/textViewName TextView
    tvPackage.setText(text);
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}


}

主要活动:

   Within onCreate

 //GETTING NAME FROM SPINNER SELECTION 
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        String value = extras.getString("name");
        textViewName.setText(value);
        **THIS IS WHERE I WANT TO DELETE ITEM FROM LIST**
        adapter.remove(value);


    }

strings.xml

<string-array name="names">
        <item>Name 01</item>
        <item>Name 02</item>
        <item>Name 03</item>
        <item>Name 04</item>
        <item>Name 05</item>
    </string-array>

预期和实际结果 我希望能够从其他活动中调用 ArrayAdapter,并删除用户在主要活动中选择的项目,但我无法在其中调用 ArrayAdapter MainActivity。

【问题讨论】:

  • Within onCreate - 我认为这是你的问题。 onCreate 仅在需要创建 Activity 时调用。如果您开始第二个Activity,第一个将在您finish() 之后进入onPause,而您的第二个Activity 第一个Activity 将通过调用onResume 恢复,所以我会将代码移到这里而不是@987654337 @
  • 我会澄清的;名称选择屏幕首先显示,在用户选择名称后,他们将被发送到我要从用户选择的列表中删除名称的主要活动。
  • 您的adapter 在SpinnerSelection 中,而不在MainActivity 中,对吗?
  • 正确。适配器和微调器都在 Spinner Activity 中。一旦用户选择了一个名称,它就会将它们发送到 Main Activity。

标签: java android android-studio android-arrayadapter


【解决方案1】:

您要完成的任务需要不同的方法。

问题总结:

您的adapter 在SpinnerSelection 内,即finished 用户从Spinner 中选择值后立即表示 每次启动 SpinnerSelection 时,您将在 Spinner 中再次拥有相同的值,因为 Spinner 是 re-created 在 onCreate 内,并填充了来自 string-array 的值。硬编码的资源文件是常量,不能在运行时删除。

解决方案:

您需要将Adapter 的值存储在其他地方,例如SQLite 或SharedPreferences(如果是少量数据)而不是string-array。这将允许您从保存它们的位置删除值,一旦从那里删除值,Spinner 将不会在 SpinnerSelection 启动时拥有它。

【讨论】:

  • 这听起来很有希望。你有如何使用 SharedPreferences 在微调器中显示列表的示例代码吗?
  • 如果您想删除该值而不管应用程序状态如何,除非用户 re-install 应用程序,否则就是这样。如果您希望在这种情况下删除该值,请考虑使用一些在线数据库,如Firebase。常见的方法是转换JSON 中的值List,然后将JSON 保存为String,例如:stackoverflow.com/questions/28107647/…
  • 如果我创建一个 List names = new ArrayList(); names.add("名字 01"); ?当我尝试像这样adapter = ArrayAdapter.createFromResource(this, deviceNameList, android.R.layout.simple_spinner_item); 将列表填充到适配器中时,我收到错误“第二个 Arg 类型错误。必需(Int)”
  • 想通了。将适配器更改为此 adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, nameList); 并使用 adaper.remove() 从列表中删除。良好的潜在客户。
  • 是的,因为Spinner 接受原始array 而不是generic List,您需要将List 转换为array。您可以在运行时从 List 中删除该值,但是一旦应用再次启动,您将在 Spinner 中拥有相同的值,因此在您的情况下,无论应用状态如何,都需要保存这些值。
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2011-06-09
  • 2010-11-22
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多