3

拡張可能なリストビューで使用し、リストビューでアイテムの 1 つを開くと、スクロールは開いているアイテムに自動的にフォーカスします。リストから新しいアイテムにフォーカスして同じ場所にとどまるのを防ぐことはできますか? 開いているビューからフォーカス可能なものを削除しようとしましたが、うまくいきませんでした。

4

2 に答える 2

7

OnGroupClickListener をオーバーライドして、イベントを消費する必要があります。これにより、ExpandableListView がデフォルトのアクションを実行するのを回避できます。これは、少なくとも 4.3 に対してコンパイルするときは、その位置にスムーズにスクロールすることです。

実装例を次に示します。

        expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            if(parent.isGroupExpanded(groupPosition)){
                parent.collapseGroup(groupPosition);
            }else{
                boolean animateExpansion = false;
                parent.expandGroup(groupPosition,animateExpansion);
            }
            //telling the listView we have handled the group click, and don't want the default actions.
            return true;
        }
    });

イベントを消費する場合、必要に応じて複製する必要があるデフォルトの動作がいくつかあります。これには、効果音の再生と展開/折りたたみリスナーの呼び出しが含まれます。

デフォルトの動作に対する参照として、Android ソース コード (4.3) から取得したものを投稿します。

    //in ExpandableListView.java 
    boolean handleItemClick(View v, int position, long id) {
    final PositionMetadata posMetadata = mConnector.getUnflattenedPos(position);

    id = getChildOrGroupId(posMetadata.position);

    boolean returnValue;
    if (posMetadata.position.type == ExpandableListPosition.GROUP) {
        /* It's a group, so handle collapsing/expanding */

        /* It's a group click, so pass on event */
        if (mOnGroupClickListener != null) {
            if (mOnGroupClickListener.onGroupClick(this, v,
                    posMetadata.position.groupPos, id)) {
                posMetadata.recycle();
                return true;
            }
        }

        if (posMetadata.isExpanded()) {
            /* Collapse it */
            mConnector.collapseGroup(posMetadata);

            playSoundEffect(SoundEffectConstants.CLICK);

            if (mOnGroupCollapseListener != null) {
                mOnGroupCollapseListener.onGroupCollapse(posMetadata.position.groupPos);
            }
        } else {
            /* Expand it */
            mConnector.expandGroup(posMetadata);

            playSoundEffect(SoundEffectConstants.CLICK);

            if (mOnGroupExpandListener != null) {
                mOnGroupExpandListener.onGroupExpand(posMetadata.position.groupPos);
            }

            final int groupPos = posMetadata.position.groupPos;
            final int groupFlatPos = posMetadata.position.flatListPos;

            final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount(); 
            smoothScrollToPosition(shiftedGroupPosition + mAdapter.getChildrenCount(groupPos),
                    shiftedGroupPosition);
        }

        returnValue = true;
    } else {
        /* It's a child, so pass on event */
        if (mOnChildClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            return mOnChildClickListener.onChildClick(this, v, posMetadata.position.groupPos,
                    posMetadata.position.childPos, id);
        }

        returnValue = false;
    }

    posMetadata.recycle();

    return returnValue;
}
于 2013-08-20T14:48:01.063 に答える
0

ハックな方法ですがExpandableListView、その ] スムーズ スクロール メソッドを拡張してオーバーライドすることができ、何もしません。コードは C# ですが、基本的な考え方は理解できます。

{
    public class NonSmoothScrollExpandableListView: ExpandableListView
    {
        public NonSmoothScrollExpandableListView(Context context): base(context)
        {

        }

        public NonSmoothScrollExpandableListView(Context context, IAttributeSet attrs) :
            base(context, attrs)
            {
        }

        public NonSmoothScrollExpandableListView(Context context, IAttributeSet attrs, int defStyle) :
            base(context, attrs, defStyle)
            {
        }

        public override void SmoothScrollByOffset(int offset)
        {
        }

        public override void SmoothScrollBy(int distance, int duration)
        {
        }

        public override void SmoothScrollToPosition(int position)
        {
        }

        public override void SmoothScrollToPosition(int position, int boundPosition)
        {
        }

        public override void SmoothScrollToPositionFromTop(int position, int offset)
        {
        }

        public override void SmoothScrollToPositionFromTop(int position, int offset, int duration)
        {
        }
    }
}
于 2017-09-13T10:49:12.453 に答える