2016-11-18 49 views
4

如何隐藏当前在一个微调器中选择的其他微调器的项目?Dynamic Spinners - 如果从一个微调器中选择一个项目,将其从其他微调器中隐藏 - Android

我试过通过ArrayList的字符串和ArrayAdapters删除项目,但我注意到,只要它从列表中删除,选择不再引用列表项(因为它不再存在) 。

现在假设我有4个动态创建的微调器,它们都有与它们的资源相同的ArrayList,现在我想用这个适配器从1微调器中获取所选项目的位置,然后隐藏它另外3名纺纱人员。

for (int i = 0; i < numberOfStops; i++) { 
       AddStopView stopView = new AddStopView(getActivity()); 
       stopView.setCallback(BaseBookingFragment.this); 
       stopView.setPassengerNames(extraPassengerNames); 
       stopViews.add(stopView); 
       parent.addView(stopView, viewPosition); 
      } 

在上面的代码中,我创建停止视图动态和每个停止视图有乘客名称微调器。这些所有spinners与他们的资源具有相同的ArrayList。从ExtraPassengerAdapter.java

从AddStopView.java

一段代码
public AddStopView(Context context) { 
    super(context); 
    initialize(); 
} 

public void setCallback(StopViewCallback callback) { 
    this.callback = callback; 
} 

public void setPassengerNames(List<String> passengerNames) { 
    this.passengerNames = passengerNames; 
    passengerAdapter.setNames(passengerNames); 
} 

private void initialize() { 
    inflate(getContext(), R.layout.view_stop, this); 

    passengerAdapter = new ExtraPassengerAdapter(getContext()); 
    passengerAdapter.setNames(passengerNames); 
    nameSpinner.setAdapter(passengerAdapter); 
    nameSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      if (view == null) { 
       return; 
      } 
      passengerName = (String) view.getTag(); 

      if (position != 0) 
       callback.updatePassengerList(AddStopView.this, (position - 1)); 
     } 

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

     } 
    }); 
} 

呼叫的代码背面nameSpinner.setOnItemSelectedListener

@Override 
public void updatePassengerList(AddStopView addStopView, int position) { 

    for (String passName : extraPassengerNames) { 
     if (addStopView.getPassengerName().equals(passName)) { 
      extraPassengerNames.remove(passName); 
      break; 
     } 
    } 

    for (AddStopView stopView : stopViews) { 
     if (!stopView.equals(addStopView)) 
      stopView.setPassengerNames(extraPassengerNames); 
    } 
} 

代码

public class ExtraPassengerAdapter extends BaseAdapter { 
private List<String> names = new ArrayList<>(); 
private Context context; 

public ExtraPassengerAdapter(Context context) { 
    this.context = context; 
    names.add(get0Position()); 
} 


public void setNames(List<String> names) { 
    this.names.clear(); 
    this.names.add(get0Position()); 
    this.names.addAll(names); 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    return names.size(); 
} 

@Override 
public String getItem(int position) { 
    return names.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView textView = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_stop, parent, false); 
    String name = getItem(position); 
    textView.setText(name); 
    textView.setTag(name); 
    return textView; 
} 

private String get0Position() { 
    return context.getString(R.string.passenger_name); 
} 

}

回答

0

我认为解决问题的正确方法是创建一个包含所有可能选项的列表,并为每个微调器创建4个带4个适配器的列表。选择某些内容时,根据所描述的逻辑更新每个列表,并为每个适配器调用adapter.notifyDataSetChanged()

+0

我也是这么做的。 Spinners正在动态创建,并根据创建的spinners,PassengerName和ExtraPassengerAdapter的ArrayList也为每个Spinner创建。但没有运气。 –

+0

您忘记了为每个适配器调用'adapter.notifyDataSetChanged()' – Max

+0

好吧。谢谢Max。让我检查一下。 –

相关问题