3

我在可扩展的列表视图中使用,当我在列表视图中打开其中一个项目时,我的滚动会自动聚焦在打开的项目上,我可以阻止列表专注于新项目并留在同一个地方吗?我试图从打开的视图中删除可聚焦的,但它没有用。

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

一种 hacky 方式,但您可以扩展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 回答