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