0

getView() がカスタム ビュー クラスを返す DataAdapter クラスがあります。ビュー自体は、いくつかのコントロールを含む LinearLayout であり、そのうちの 1 つが CheckBox です。また、データベースの ID と DataAdapter のインデックスといういくつかのプロパティもあります。

CheckBox OnCheckedChange イベントが発生したら、DataAdapter でイベントを発生させて、基になるデータを変更する必要があります。インターフェイスを使用して、ビューにカスタム イベントを設定できます。

private OnChangedListener mListener;

public interface OnChangedListener{
    public void onChanged();
}

public void setOnChangedListener(OnChangedListener eventListener) {
    mListener=eventListener;
}

CheckBox の CheckedChange から呼び出します。

private OnCheckedChangeListener checkChanged = new OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
        mListener.onChanged();
    }
}; 

しかし、ビューを引数として返す方法を考え出すことはできません。ビューを返すようにインターフェイスを変更すると、次のようになります。

public interface OnChangedListener{
    public void onChanged(MyCustomView arg0);
}

OnCheckedChangeListener() 内からビューを返すことができません:

private OnCheckedChangeListener checkChanged = new OnCheckedChangeListener(){
    @Override
    public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
        mListener.onChanged(this);
    }
}; 

「MyCustomView.OnChangedListener 型のメソッド onChanged(MyCustomView) は、引数には適用できません (new CompoundButton.OnCheckedChangeListener(){})」

Handler.Post を使用することを考えましたが、Runnable 内にいるため、まだビューを公開できません。

私が見逃している単純なものがあるに違いないと確信しています...

4

2 に答える 2

0

thisinmListener.onChanged(this);はビューを参照するのではなく、OnCheckedChangeListener(ラッピング クラス) を参照します。次のようにビューを返す必要があります。

mListener.onChanged(/*reference to your view*/)
于 2013-12-12T13:16:52.277 に答える
0

The answer was simple. The CheckButtons parent should be the instance of the view I'm looking for:

    public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
        ViewParent parent = arg0.getParent();

        if (parent instanceof CustomView){
            Custom myView = (CustomView) parent;
            mListener.onChanged(myView);
        }
    }
于 2013-12-13T09:19:46.850 に答える