2013-04-02 102 views
6

我有两个纺纱器,我想互相“排挤”在一个相互排斥的意义上:如果您在一个中选择一个项目,该项目的文本变成红色并出现在顶部,而另一个返回显示初始(“标题”)选择(如果先前选择了另一个项目),并且其文本变为白色。“同步”两个纺纱器

这是通过onItemSelected听众全部完成:

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View arg1, 
       int position, long arg3) {    
      issueSpin.setSelection(0);          
      ((TextView) issueSpin.getChildAt(0)).setTextColor(Color.parseColor("#FFFFFF")); 
      ((TextView) arg1).setTextColor(Color.parseColor("#E3170D")); 
.... 

,反之亦然为“的问题微调”。我的问题是,如果我要从一个微调器转到另一个微调器并选择顶层项目,则onItemSelectedListener不会注册,因为所选项目已被选中。

我被告知这是不可能的。或者,我被告知,onItemSelected侦听器不可能触发已经选择的项目。虽然我意识到这在技术上是正确的,但这个问题似乎相对简单,我相信必须有一个解决方法来产生所需的效果。

我有一些相关的几个问题,我正在琢磨:

  1. 有什么办法来设置在旋转为未选中的所有项目,同时还显示其中之一吗?
  2. 我可以利用不同类型的事件(即'setOnTouchListener','setOnClickListener'等),大概在最上面的项目上,连同onItemSelectedListener
  3. 我是否应该使用不同类型的事件本身,也许在微调器本身膨胀的视图中,没有onItemSelectedListener
  4. 你能帮我找到一个比上面提到的要点更好的策略吗?

回答

1

而不是使用Spinner,使用一个Button视觉上类似于非活动Spinner。单击按钮时,显示包含ListView的自定义Dialog。您可以使用setSelection方法和/或AdaptergetView中的位置显示当前选择哪个项目。 ListViewOnItemClickListener会收到通知,无论项目是否被选中,点击都会被点击。

当您找到哪个项目被点击时,隐藏Dialog并通知包含此按钮的按钮Activity,以便它可以根据需要更新Buttons

我已经使用DialogFragmentsDialogFragmentParent实现了一些非常类似的东西,它工作正常。

+0

但是这个应用程序的整体设计至关重要,菜单像一个微调器一样打开 - 即选项下降。 – drewmoore

+0

@drewmore我给出了一个解决问题中所描述的问题的答案。我首先考虑对Spinner进行子分类并覆盖负责的方法(如果选择的项目相同,则明确表示“onItemSelectedListener”未被调用),但这是不可能的,因为该方法是私有的。如果您需要使用其他方法严重影响动画,则可以模拟动画。但是,如果我的回答由于某些未在问题原因中披露而无法帮助您,那么您应该编辑您的问题。 – Shade

1

你有没有考虑像下面,

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("sectionSpin"); 
    } 
} 

而对于另外一个

issueSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("issueSpin"); 
    } 
} 

现在

private void updateView(String spinner){ 
    if (spinner.equals(sectionSpin)){ 
     //update spinner per requirement 

    } 
    else{ 
    //update spinner per requirement 
    } 

} 

你也可以考虑一些额外的变量或参数如果第一次选择的项目跟踪跟踪。

+0

这仍然依赖于onItemSelected()侦听器,如果用户选择已在顶部的项目,则该侦听器不会触发。 – drewmoore

0

因此,您可以使纺纱器中的第一项无效选择,如“[选择一个]”或“[选择标题]”,迫使听众每次发射。

这将有额外的好处,你会知道用户在下一步之前做过选择。

当然,这取决于期望的应用程序流程。