android spinner保存对象,Android Spinner:在初始化期间避免onItemSelected调用

本文介绍了如何在Android应用中,避免在Spinner组件初始化时就触发onItemSelected事件,只在用户实际选择下拉列表项后才更新TextView的显示。通过设置延迟执行、布尔标志、用户交互检测等方式,确保正确处理用户交互和视图更新时机。
摘要由CSDN通过智能技术生成

Android Spinner:在初始化期间避免onItemSelected调用

我用Spinner和TextView创建了Android应用程序。我的任务是在TextView的Spinner的下拉列表中显示所选项目。 我在onCreate方法中实现了Spinner,因此当我运行程序时,它会在TextView中显示一个值(在从下拉列表中选择项目之前)。

我只想在从下拉列表中选择一个项目后才在TextView中显示该值。 我该怎么做呢?

这是我的代码:

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemSelectedListener;

import android.widget.ArrayAdapter;

import android.widget.Spinner;

import android.widget.TextView;

public class GPACal01Activity extends Activity implements OnItemSelectedListener {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects);

// Create an ArrayAdapter using the string array and a default spinner layout

ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item);

// Specify the layout to use when the list of choices appears

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

// Apply the adapter to the spinner

spinner.setAdapter(adapter);

spinner.setOnItemSelectedListener(this);

}

public void onItemSelected(AdapterView> parent, View arg1, int pos,long id) {

TextView textView = (TextView) findViewById(R.id.textView1);

String str = (String) parent.getItemAtPosition(pos);

textView.setText(str);

}

public void onNothingSelected(AdapterView> arg0) {

// TODO Auto-generated method stub

}

}

13个解决方案

141 votes

spinner.setOnItemSelectedListener(this); // Will call onItemSelected() Listener.

所以第一次用任何Integer值处理它

例:  最初采取int check = 0;

public void onItemSelected(AdapterView> parent, View arg1, int pos,long id) {

if(++check > 1) {

TextView textView = (TextView) findViewById(R.id.textView1);

String str = (String) parent.getItemAtPosition(pos);

textView.setText(str);

}

}

您可以使用布尔值以及检查当前位置和先前位置来执行此操作。 看这里

Abhi answered 2019-07-08T02:25:39Z

75 votes

只需在设置OnItemSelectedListener之前放置此行

spinner.setSelection(0,false)

Dayanand Waghmare answered 2019-07-08T02:26:05Z

54 votes

从API级别3开始,您可以在具有布尔值的Activity上使用onUserInteraction()来确定用户是否正在与设备进行交互。

[http://developer.android.com/reference/android/app/Activity.html#onUserInteraction()]

@Override

public void onUserInteraction() {

super.onUserInteraction();

userIsInteracting = true;

}

作为活动的一个领域,我有:

private boolean userIsInteracting;

最后,我的微调器:

mSpinnerView.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override

public void onItemSelected(AdapterView> arg0, View view, int position, long arg3) {

spinnerAdapter.setmPreviousSelectedIndex(position);

if (userIsInteracting) {

updateGUI();

}

}

@Override

public void onNothingSelected(AdapterView> arg0) {

}

});

当你来完成活动时,布尔值会重置为false。 奇迹般有效。

Bill Mote answered 2019-07-08T02:27:03Z

12 votes

这对我有用

Android中Spinner的初始化有时会出现问题通过这种模式解决了上述问题。

Spinner.setAdapter();

Spinner.setSelected(false); // must

Spinner.setSelection(0,true); //must

Spinner.setonItemSelectedListener(this);

设置适配器应该是第一部分,onItemSelectedListener(this)在初始化微调器时将是最后一个。 通过上面的模式,在初始化微调器期间不会调用我的OnItemSelected()

saksham answered 2019-07-08T02:27:42Z

10 votes

哈哈......我有同样的问题。当initViews()只是这样做时。序列是关键,监听器是最后一个。 祝好运 !

spinner.setAdapter(adapter);

spinner.setSelection(position);

spinner.setOnItemSelectedListener(listener);

Treesouth answered 2019-07-08T02:28:09Z

7 votes

我的解决方案

protected boolean inhibit_spinner = true;

@Override

public void onItemSelected(AdapterView> arg0, View arg1,

int pos, long arg3) {

if (inhibit_spinner) {

inhibit_spinner = false;

}else {

if (getDataTask != null) getDataTask.cancel(true);

updateData();

}

}

codareee answered 2019-07-08T02:28:31Z

6 votes

你可以通过这种方式做到这一点:

AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() {

@Override

public void onItemSelected(AdapterView> adapterView, View view, int i, long l) {

//set the text of TextView

}

@Override

public void onNothingSelected(AdapterView> adapterView) {

}

});

yourSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

@Override

public void onItemSelected(AdapterView> adapterView, View view, int i, long l) {

yourSpinner.setOnItemSelectedListener(listener);

}

@Override

public void onNothingSelected(AdapterView> adapterView) {

}

});

首先,我创建一个监听器并归因于一个变量回调; 然后我创建一个匿名的第二个监听器,当第一次调用它时,这会改变监听器=]

Charleston answered 2019-07-08T02:29:08Z

2 votes

启用多个微调器的类似简单解决方案是将AdapterView放在一个集合中 - 在活动超类中 - 首次执行onItemSelected(...)然后在执行之前检查AdapterView是否在集合中。 这使得超类中的一组方法成为可能,并支持多个AdapterView以及多个微调器。

超级......

private Collection AdapterViewCollection = new ArrayList();

protected boolean firstTimeThrough(AdapterView parent) {

boolean firstTimeThrough = ! AdapterViewCollection.contains(parent);

if (firstTimeThrough) {

AdapterViewCollection.add(parent);

}

return firstTimeThrough;

}

子类......

public void onItemSelected(AdapterView> parent, View view, int pos, long id) {

if (! firstTimeThrough(parent)) {

String value = safeString(parent.getItemAtPosition(pos).toString());

String extraMessage = EXTRA_MESSAGE;

Intent sharedPreferencesDisplayIntent = new Intent(SharedPreferencesSelectionActivity.this,SharedPreferencesDisplayActivity.class);

sharedPreferencesDisplayIntent.putExtra(extraMessage,value);

startActivity(sharedPreferencesDisplayIntent);

}

// don't execute the above code if its the first time through

// do to onItemSelected being called during view initialization.

}

Jonathan Cole answered 2019-07-08T02:29:52Z

1 votes

有同样的问题,这对我有用:

我有2个微调器,我在初始化期间以及与其他控件交互期间或从服务器获取数据后更新它们。

这是我的模板:

public class MyClass extends implements Spinner.OnItemSelectedListener {

private void removeSpinnersListeners() {

spn1.setOnItemSelectedListener(null);

spn2.setOnItemSelectedListener(null);

}

private void setSpinnersListeners() {

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

spn1.setOnItemSelectedListener(MyClass.this);

spn2.setOnItemSelectedListener(MyClass.this);

}

}, 1);

}

@Override

public void onItemSelected(AdapterView> parent, View view, int position, long id) {

// Your code here

}

@Override

public void onNothingSelected(AdapterView> parent) {

}

}

当类启动时使用setSpinnersListeners()而不是直接设置监听器。

Runnable将在您设置其值后立即阻止微调器触发onItemSelected。

如果需要更新微调器(在服务器调用之后等),请在更新行之前使用removeSpinnersListeners(),并在更新行之后使用setSpinnersListeners()。 这将阻止onItemSelected在更新后触发。

RoyBS answered 2019-07-08T02:30:55Z

1 votes

你可以先通过setOnTouchListener实现它,然后再通过onTouch实现setOnItemSelectedListener

@Override

public boolean onTouch(final View view, final MotionEvent event) {

view.setOnItemSelectedListener(this)

return false;

}

vviieett answered 2019-07-08T02:31:21Z

1 votes

然后,可以在onTouch方法中将用户交互标志设置为true,并在处理选择更改后重置为OnItemSelectedListener。 我更喜欢这种解决方案,因为用户交互标志专门为微调器处理,而不是针对活动中可能影响所需行为的其他视图。

在代码中:

为微调器创建监听器:

public class SpinnerInteractionListener implements AdapterView.OnItemSelectedListener, View.OnTouchListener {

boolean userSelect = false;

@Override

public boolean onTouch(View v, MotionEvent event) {

userSelect = true;

return false;

}

@Override

public void onItemSelected(AdapterView> parent, View view, int pos, long id) {

if (userSelect) {

userSelect = false;

// Your selection handling code here

}

}

}

将侦听器作为OnItemSelectedListener和OnTouchListener添加到微调器:

SpinnerInteractionListener listener = new SpinnerInteractionListener();

mSpinnerView.setOnTouchListener(listener);

mSpinnerView.setOnItemSelectedListener(listener);

Ranjith Kumar answered 2019-07-08T02:32:06Z

1 votes

避免在初始化期间调用spinner.setOnItemSelectedListener()

spinner.setSelection(Adapter.NO_SELECTION, true); //Add this line before setting listener

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

@Override

public void onItemSelected(AdapterView> parent, View view, int position, long id) {

}

@Override

public void onNothingSelected(AdapterView> parent) {

}

});

Ketan Ramani answered 2019-07-08T02:32:34Z

1 votes

创建一个布尔字段

private boolean inispinner;

在里面创造活动

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

@Override

public void onItemSelected(AdapterView> parent, View view, int position, long id) {

if (!inispinner) {

inispinner = true;

return;

}

//do your work here

}

@Override

public void onNothingSelected(AdapterView> parent) {

}

});

Afjalur Rahman Rana answered 2019-07-08T02:33:08Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值