代码之家  ›  专栏  ›  技术社区  ›  rhinds

Android-更改相关的ListView行复选框

  •  1
  • rhinds  · 技术社区  · 14 年前

    我目前在我的Android应用程序中有一个列表视图,旁边有一个复选框。

    当复选框被更改时,我希望从按钮所在的ListView行中获取一些信息,然后将其持久化,但是,我无法解决如何从OnClickChanged侦听器中获取行数据。

    我的ListView是使用自定义JSONObject ListAdapter填充的,我希望它类似于在检测OnLongTouch时确定所选的行-例如,下面是我用于获取在longTouch上所选行的相关JSON对象的代码:

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

    上面显然在我的list activity中,并且我的oncheckChanged侦听器将不在同一个活动中(因为它是在行中定义的,而不是在列表中定义的)。

    任何帮助都将不胜感激!

    1 回复  |  直到 14 年前
        1
  •  4
  •   Thorstenvv    14 年前

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

    在适配器中,像这样添加(或修改)bindView重写,以添加包含所需上下文信息的标记:

        @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);
    
    }