3

を使用してcustom adpater in AlertDialogいます。そのアダプターでは、私は使用してTextView and CheckBoxいます..今setOnCheckedChangeListener、チェック済みまたは未チェックのチェックボックスをチェックするためのチェックボックスを処理したい..そして、チェックボックスのステータスに応じて、いくつかのコードを実装したい. しかし、このリスナーは複数回起動されます..どうすればそれを処理できますか? 誰かがアイデアを持っているなら、私に提案してください。

そしてまさに私の問題は、チェックボックスをオンにしたときに値を増やしたいのですが、チェックを外したときに値を減らしたいのですが、正確な合計値を取得できず、スクロールするとこの合計値が変更されます..私がしなければならないこと?

以下は私のカスタムアダプターです:

private class Updateinfo_ServiceAdapter extends BaseAdapter
{

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return _options_services.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Viewholder holder;
        LayoutInflater inflater=getLayoutInflater();

        if(convertView==null)
        {
            convertView=inflater.inflate(R.layout.row_updateinfo_service, null);
            holder=new Viewholder();
            holder.txtname=(TextView)convertView.findViewById(R.id.serviceName);
            holder.chkSelected=(CheckBox)convertView.findViewById(R.id.chk);
            convertView.setTag(holder);
        }
        else
        {
            holder=(Viewholder)convertView.getTag();
        }

        holder.txtname.setText(_options_services[position]);        
        holder.chkSelected.setChecked(_selections_services[position]);



        holder.chkSelected.setOnCheckedChangeListener(new OnCheckedChangeListener() 
        {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
            {

                if (isChecked) {
                    allowServicesSum = allowServicesSum
                            + Integer.parseInt((String) services[position]
                                    .getSystemServiceID());
                    System.out.println("AllowService sum is "+allowServicesSum);
                } else {
                    allowServicesSum = allowServicesSum
                            - Integer.parseInt((String) services[position]
                                    .getSystemServiceID());
                    System.out.println("AllowService sum is "+allowServicesSum);
                }
            }
        });

               if(_selections_services[position])
        {
            holder.chkSelected.setEnabled(false);
        }
        else
        {
            holder.chkSelected.setEnabled(true);
        }

        return convertView;
    }

    private class Viewholder
    {
        TextView txtname;
        CheckBox chkSelected;
    }

}
4

1 に答える 1

3

convertView既存の を再利用する場合、リスナーはすでに設定されていることを忘れています。したがって、 を実行するholder.chkSelected.setCheckedと、前回 からこのビューを返したときに設定されたリスナーがトリガーされますgetView

holder.chkSelected.setOnCheckedChangeListener(null);この問題を回避する最も簡単な方法は、行の直後に呼び出すことholder=(Viewholder)convertView.getTag();です。これにより、後で を呼び出したときにリスナーが存在しないことが保証されます。その後setChecked、リスナーを再度追加できます。

于 2013-08-06T10:36:39.963 に答える