2013-01-16 17 views
2

我希望我的ListView突出显示所选项目,直到选择更改。另外,我希望在选择更改时收到通知。Android:在单选模式ListView中选择更改时如何得到通知?

为了完成第一项任务,我打电话给list.setChoiceMode(ListView.CHOICE_MODE_SINGLE)

我不知道如何完成第二个。当点击一个列表项时,我的OnItemSelectedListener永远不会被通知,并且OnItemClickListener是不够的,因为在OnItemClick事件发生时,我的ListView的checkedItem已被修改,所以我无法区分click事件是否导致选择更改(它是可能/可能已点击的项目已被选中)。

一个选择是将当前检查的索引存储在一个成员变量中,我可以使用该成员变量来确定click事件是否对应于选择更改。但是,这个丑陋的,因此,对于这种选择模式,当然有一种方法可以用提供的监听器来做到这一点?

public class Temp extends Activity implements OnItemClickListener, OnItemSelectedListener 
{ 
    ListView mView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     List<String> strings = new ArrayList<String>(); 
     strings.add("1"); 
     strings.add("2"); 
     strings.add("3"); 
     strings.add("4"); 
     strings.add("5"); 


     mView = new ListView(this); 
     mView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     mView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_activated_1, strings)); 
     mView.setItemChecked(0, true); 

     mView.setOnItemClickListener(this); 
     mView.setOnItemSelectedListener(this); 

     setContentView(mView); 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
    { 
     //this never gets called 
     Log.e("item selected", ""+position); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) 
    { 
     Log.e("nothing seleted", ""); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
       //by the time this occurs, position == mView.getCheckedItemPosition() 
     Log.e("item clicked", ""+position); 
    } 
} 

回答

7

当单击列表项,我OnItemSelectedListener从不通知。

当您使用轨迹球,键盘导航或使用其他类型的非触摸导航时,OnItemSelectedListener仅由ListView调用。它与选择模式无关。

一个选项是将当前检查的索引存储在一个成员变量中,我可以使用该成员变量来确定单击事件是否对应于选择更改。

这是最好的选择。它只涉及一个额外的int和一个if语句。

相关问题