2010-09-05 59 views
1

我目前在我的Android应用程序中有一个ListView,其旁边有一个CheckBox。Android - 在CheckBox上获取相关的ListView行已更改

当复选框更改时,我想从listview行中获取按钮所在的一些信息,然后保留它,但是,我无法弄清楚如何从onClickChanged监听器获取行数据。

我的列表视图是使用自定义JSONObject listadapter填充的,我希望这是类似的工作,检测onLongTouch时选择哪个行 - 例如下面是我用来获取行的相关JSON对象的代码在longTouch选择:

public boolean onContextItemSelected(MenuItem item) { 
     //get row selected information 
     AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
     JSONObject selected = (JSONObject) getListAdapter().getItem(menuInfo.position); 

以上显然是我的ListActivity中,我的onCheckChanged听众就不会在相同的活动(因为它是该行中定义的,而不列表)

任何帮助将不胜感激!

回答

4

解决此问题的一种可能方法是在发生绑定时将某些信息附加到复选框。

在适配器中,添加(或修改)bindView覆盖这样添加一个标签thatcontains您需要的上下文信息:

@Override 
    public void bindView(View view, Context context, Cursor cursor){ 
     CheckBox checker = (CheckBox)view.findViewById(R.id.checkbox); 

     checker.setOnCheckedChangeListener(MyActivity.this); 
     checker.setTag(Long.valueOf(cursor.getLong(cursor.getColumnIndex(BaseColumns._ID)))); 
     // call super class for default binding 
     super.bindView(view,context,cursor); 
    } 

(或任何其他值附加到帮助您识别复选框项,例如属性格式名称或索引)

然后,在onCheckedChanged,你可以参考此信息识别已更改的项目:

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    Long id = (Long) buttonView.getTag(); 
    if (id!=null) 
     Log.d(TAG, "onCheckedChanged id="+id); 

} 
+0

谢谢!实际上,我昨天晚上在复选框上使用了一个Tag,完全采用了相同的方法! (我经历了这个问题和解决方案,很长一段时间,我的实际代码是http://automateddeveloper.blogspot.com/2010/09/everything-you-need-to-know-about.html) – rhinds 2010-09-06 13:58:56