如何解决setOnItemSelectedListener的随机行为
我有一个带有3个下拉列表(A,B,C)的表单,可从服务器获取数据。每个下拉列表的数据取决于在其上方的下拉列表中选择的内容。因此,如果更改了A,则B和C都需要刷新。
我的问题是我的下拉菜单C的行为随机。有时它调用onitemselected函数,有时不是,它改变了C的值。
为了更好地理解,这是我的代码: 以下是下拉列表A的自定义适配器,因为我需要多行下拉列表。
public class MyAdapter extends ArrayAdapter {
PojoLcommodityName pojoLcommodityName;
int poss ;
boolean open=false;
public MyAdapter(Context context,int textViewResourceId,List<String> coal,PojoLcommodityName pojoLcommodityName,int poss) {
super(context,textViewResourceId,coal);
this.poss = poss;
this.pojoLcommodityName = pojoLcommodityName;
}
public View getCustomView(int position,View convertView,ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.res_custom,parent,false);
TextView tv_coalname = (TextView) layout
.findViewById(R.id.text1);
tv_coalname.setText(categories.get(position));
tv_coalname.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
if (!open) { // user selected nothing...
spinner.performClick();
open = true;
} else {
//
spinner.setSelection(position); //from here other dropdown selection starts
ViewGroup parent = (ViewGroup) spinner.getParent();
ViewGroup.LayoutParams params = spinner.getLayoutParams();
parent.removeView(spinner);
parent.addView(spinner);
spinner.setLayoutParams(params);
scommodity = pojoLcommodityName.getDetail().get(position).getCommodityId() + "";
tv_cmodity.setText(categories.get(position) + "");
tv_grade.setText(pojoLcommodityName.getDetail().get(position).getGrade());
open = false;
}
} catch (Exception e) {
}
}
});
return layout;
}
下一个代码在同一个文件中,最初会调用此代码来构建下拉列表A(在此命名为Spinner)
private void comoditylist(ArrayList<String> categories) {
try{
MyAdapter adapter = new MyAdapter(getActivity(),R.layout.res_custom,categories,response.body(),pos);
spinner.setAdapter(adapter);
spinner.setSelection(pos);
scommodity = response.body().getDetail().get(pos).getCommodityId() + "";
tv_cmodity.setText(categories.get(pos));
From( response.body().getDetail().get(pos).getCommodityId());
}catch (Exception e){
}
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView,View view,int position,long l) {
try {
if (response.body().getDetail().get(position).getSizeStatus().equals("No")) {
relativ_size.setVisibility(View.GONE);
} else {
relativ_size.setVisibility(View.VISIBLE);
}
From(response.body().getDetail().get(position).getCommodityId()); //this function populates B and C dropdown
}
最后,此块是发生问题的地方。在我的手机上,当我选择下拉菜单A时,B和C下拉菜单均会根据以下代码进行更新。但是为了在A中选择相同的值,有时我将tv_vesselname命名为'Given',有时将其命名为'Not Given'
在这里输入代码
public void From(final String fromid)
{
ApiInterface apiInterface2 = Retrofit.getRetrofit().create(ApiInterface.class);
Call<PojoListningFrome> callApi2 = apiInterface2.ListningFrome(""+fromid);
callApi2.enqueue(new Callback<PojoListningFrome>() {
@Override
public void onResponse(Call<PojoListningFrome> call,final Response<PojoListningFrome> response) {
final List<String> getDestination = new ArrayList<String>();
posfrom = 0;
for (int i = 0; i < response.body().getDetail().size(); i++) {
getDestination.add(response.body().getDetail().get(i).getCityName()); //this builds the array for dropdown B
}
try{
ArrayAdapter<String> dataAd = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,getDestination);
dataAd.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerFrom.setAdapter(dataAd);
spinnerFrom.setSelection(posfrom);
}catch (Exception e){
}
int finalI = i;
//spinnerFrom is the spinner for dropdown B
spinnerFrom.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override //spinnerveesals
public void onItemSelected(AdapterView<?> adapterView,int ff,long l) {
try {
final List<String> getVesselName = new ArrayList<String>();
posvessel = 0;
for (int ii = 0; ii < response.body().getDetail().get(ff).getVesselDetail().size(); ii++) {
getVesselName.add(response.body().getDetail().get(ff).getVesselDetail().get(ii).getVesselName());
//this above is where we build array for dropdown C
}
try{
ArrayAdapter<String> dataAd = new ArrayAdapter<String>(getActivity(),getVesselName);
dataAd.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//spinnervesals is dropdown C
spinnervesals.setAdapter(dataAd);
spinnervesals.setSelection(posvessel);
}catch (Exception e){
}
spinnervesals.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override //this function is sometimes entered after the end of code ------- X
public void onItemSelected(AdapterView<?> adapterView,int io,long l) {
svesselsid = response.body().getDetail().get(ff).getVesselDetail().get(io).getVesselId();
tv_vesselname.setText("Given");
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
progressBarbuy.setVisibility(View.GONE);
}
});
} catch (Exception e) {
}
//------------ Y-------
if(response.body().getDetail().get(ff).getVesselStatus().equals("No")){
//in my case this 'if' is true. But sometimes after this block of
//code spinnervesals.setOnItemSelectedListener gets called and it sets tv_vesselname to 'Given'.
// For same selection of data on Ui,sometimes i am getting result as 'Not Given' and Sometimes as Given
// -------------------------- Y
rl_vesels.setVisibility(View.GONE);
svesselsid = "19";
tv_vesselname.setText("Not Given");
}
else{
rl_vesels.setVisibility(View.VISIBLE);
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
progressBarbuy.setVisibility(View.GONE);
}
});
}
}
catch (Exception e)
{
}
}
@Override
public void onFailure(Call<PojoListningFrome> call,Throwable t) {
}
});
}
我尝试使用调试器,我发现最初在打开屏幕时,由于两次输入X,代码被注释掉了。然后紧接着,当我在下拉菜单A中选择一个值,而我知道在下拉列表C中它将选择一个Y条件为真的值(最高值)时,大多数时候tv_vesselname会设置为“给定”(即在末尾的Y块被执行),但有时它被设置为“未给定”(即有时在执行Y块之后,在末尾再次调用代码块X。)
如果又一次我将Dropdown A的值更改为我再次知道C将选择Y条件为真的值(最高值)的东西,则它将首先运行块Y,然后运行块X。
有什么想法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。