我在可扩展的列表视图中使用,当我在列表视图中打开其中一个项目时,我的滚动会自动聚焦在打开的项目上,我可以阻止列表专注于新项目并留在同一个地方吗?我试图从打开的视图中删除可聚焦的,但它没有用。
问问题
4564 次
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 回答