3

common のカスタム アダプターによって作成されたビューのライフ サイクルに関連する問題がありますListView。次のようにカスタム ビューを作成しました。

    public class NSViewZoneLarge extends RelativeLayout
    {
        private long mZoneId;
        private ToggleButton mOnOffButton;

        public NSViewZoneLarge(Context context, boolean showSwitch, long zoneId)
        {
            super(context);
            LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            layoutInflater.inflate(R.layout.view_zone_large, this);
            mOnOffButton = (ToggleButton) findViewById(R.id.toggleButtonOnOff);

            ImageView imgView = (ImageView)findViewById(R.id.imageViewZoneType);
            imgView.setFocusable(false);

            if (showSwitch)
            {
                mOnOffButton.setVisibility(View.VISIBLE);
            }
            else
            {
                mOnOffButton.setVisibility(View.INVISIBLE);
                mOnOffButton.setEnabled(false);
                mOnOffButton.setFocusable(false);
                mOnOffButton.setFocusableInTouchMode(false);
            }

            mZoneId = zoneId;
        }

        // ---------------------------------------------------------------------------------------
        public NSViewZoneLarge(Context context, AttributeSet attrs)
        {
            super(context, attrs);
        }

        // ---------------------------------------------------------------------------------------
        public void setZoneName(String zoneName)
        {
            TextView tVZoneName = (TextView) findViewById(R.id.textViewZoneName);
            tVZoneName.setText(zoneName);
        }

        // ---------------------------------------------------------------------------------------
        public String getZoneName()
        {
            TextView tVZoneName = (TextView) findViewById(R.id.textViewZoneName);
            return tVZoneName.getText().toString();
        }

        // ---------------------------------------------------------------------------------------
        public void setOnOffButton(boolean isOn)
        {
            ToggleButton onOffButton = (ToggleButton) findViewById(R.id.toggleButtonOnOff);
            onOffButton.setChecked(isOn);
        }

        // ---------------------------------------------------------------------------------------
        public boolean isOnOffButtonChecked()
        {
            ToggleButton onOffButton = (ToggleButton) findViewById(R.id.toggleButtonOnOff);
            return onOffButton.isChecked();
        }

        // ---------------------------------------------------------------------------------------
        public long getZoneId()
        {
            return mZoneId;
        }
}

次に、サブクラスgetView()のメソッドでこのビューをインスタンス化します。BaseAdapter

// ---------------------------------------------------------------------------------------
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    NSDestinationContent destinationContent = mDestinationContents.get(position);
    NSViewZoneLarge viewZone = new NSViewZoneLarge(mContext, mShowSwitches, destinationContent.mDestinationContentId);

    viewZone.setZoneName(destinationContent.mName);

    if (mShowSwitches)
        viewZone.setOnOffButton(mOnOffStates.get(position));

    if (destinationContent.mDestinationTypeId.equals(DestinationTypeId.SPEAKERS_GROUP))
    {
        NSSpeakerGroup speakerGroup = (NSSpeakerGroup) destinationContent;
        viewZone.setZoneType(speakerGroup.mZoneTypeId);
    }

    return viewZone;
}

最後に、次のように設定OnItemLongClickListenerしましたlistView

    mZonesListView.setOnItemLongClickListener(new OnItemLongClickListener()
    {
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id)
        {
            NSViewZoneLarge viewZoneLarge = (NSViewZoneLarge)view;
            long destinationId = viewZoneLarge.getZoneId();
            ClipData data = ClipData.newPlainText(NSConstants.DRAG_KEY_ZONE_ID, String.valueOf(destinationId));

            view.startDrag(data, new DragShadowBuilder(view), null, 0);

            Intent intent = new TrashBinIntent(true);
            LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(ApplicationNetSpeaker.getInstance());
            localBroadcastManager.sendBroadcast(intent);

            return true;
        }
    });

問題は、メソッドのコンストラクターをgetZoneId()介してこの値を正しく設定しても、メソッドが常に null を返すことです。NSViewZoneLargegetView()

null を返す理由はわかっています。メソッドによって作成されたものではないOnItemLongClickListenerインスタンスを私に与えるからです。どこかで、どういうわけか、インスタンスは 2 番目のデフォルト コンストラクターのみで作成されます。NSViewZoneLargegetView()NSViewZoneLarge

setTag()また、メソッドを使用してデータをビューに関連付けようとしましたが、getTag()メソッドは常に null を返します。元のインスタンスはどこかで失われ、おそらく GC によって解放され、代わりにタグが設定されていない新しいインスタンスを取得します。

なぜこれが発生するのか、どのような種類のデータをListViewアイテムの特定のビューに関連付けるにはどうすればよいのか、誰か説明してもらえますか?

4

0 に答える 0