Java 从自定义适配器重写getContextMenuInfo()

Java 从自定义适配器重写getContextMenuInfo(),java,android,android-adapter,custom-lists,android-contextmenu,Java,Android,Android Adapter,Custom Lists,Android Contextmenu,我正在建立一个列表,必须能够重新排序项目的位置 对我来说幸运的是,我找到了一份工作 不幸的是,我无法使用onContextItemSelected()实现删除项操作,因为menuInfo始终返回null,因此我无法读取要删除的选定项的位置 通过重写getContextMenuInfo()给出了解决方案 如果onContextItemSelected(MenuItem item)方法中的item.getMenuInfo()为null,我猜您使用的是自定义ListView或GridView,而不是a

我正在建立一个列表,必须能够重新排序项目的位置

对我来说幸运的是,我找到了一份工作

不幸的是,我无法使用onContextItemSelected()实现删除项操作,因为menuInfo始终返回null,因此我无法读取要删除的选定项的位置

通过重写getContextMenuInfo()给出了解决方案

如果onContextItemSelected(MenuItem item)方法中的item.getMenuInfo()为null,我猜您使用的是自定义ListView或GridView,而不是android默认的。在这种情况下,自定义视图没有实现getContextMenuInfo()方法。别担心,如果你知道它的来源,我们可以修复它。打开视图文件并重写方法getContextMenuInfo()

我试过很多方法,但似乎我做错了

这是唯一的解决办法还是我遗漏了什么

活动
这是一篇老文章,但我用同样的draglistview找到了它

我用的是Xamarin,但它非常接近。只需根据需要在Java中键入C#:

protected override IContextMenuContextMenuInfo ContextMenuInfo
    {
        get
        {
            IContextMenuContextMenuInfo menuInfo = base.ContextMenuInfo;
            if (menuInfo == null)
            {
                IListAdapter adapter = Adapter;
                int pos = GetPositionForView(selectedView);
                menuInfo = new AdapterContextMenuInfo(selectedView, pos, adapter.GetItemId(pos));
            }
            return menuInfo;
        }
    }


public void OnLongPress(MotionEvent e){
        int position = PointToPosition(mDownX, mDownY);
        int itemNum = position - FirstVisiblePosition;
        selectedView = GetChildAt(itemNum); //class variable
...
}

这是一篇老文章,但我用同样的draglistview找到了它

我用的是Xamarin,但它非常接近。只需根据需要在Java中键入C#:

protected override IContextMenuContextMenuInfo ContextMenuInfo
    {
        get
        {
            IContextMenuContextMenuInfo menuInfo = base.ContextMenuInfo;
            if (menuInfo == null)
            {
                IListAdapter adapter = Adapter;
                int pos = GetPositionForView(selectedView);
                menuInfo = new AdapterContextMenuInfo(selectedView, pos, adapter.GetItemId(pos));
            }
            return menuInfo;
        }
    }


public void OnLongPress(MotionEvent e){
        int position = PointToPosition(mDownX, mDownY);
        int itemNum = position - FirstVisiblePosition;
        selectedView = GetChildAt(itemNum); //class variable
...
}

谢谢你的反馈,内特!谢谢你的反馈,内特!
public class DragListView extends FrameLayout {

public interface DragListListener {
    void onItemDragStarted(int position);

    void onItemDragEnded(int fromPosition, int toPosition);
}

private DragItemRecyclerView mRecyclerView;
private DragListListener mDragListListener;
private DragItem mDragItem;
private boolean mDragEnabled = true;
private float mTouchX;
private float mTouchY;

public DragListView(Context context) {
    super(context);
}

public DragListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public DragListView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mDragItem = new DragItem(getContext());
    mRecyclerView = createRecyclerView();
    mRecyclerView.setDragItem(mDragItem);
    addView(mRecyclerView);
    addView(mDragItem.getDragItemView());
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean retValue = handleTouchEvent(event);
    return retValue || super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean retValue = handleTouchEvent(event);
    return retValue || super.onTouchEvent(event);
}

private boolean handleTouchEvent(MotionEvent event) {
    mTouchX = event.getX();
    mTouchY = event.getY();
    if (isDragging()) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                mRecyclerView.onDragging(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mRecyclerView.onDragEnded();
                break;
        }
        return true;
    }
    return false;
}

private DragItemRecyclerView createRecyclerView() {
    final DragItemRecyclerView recyclerView = (DragItemRecyclerView) LayoutInflater.from(getContext()).inflate(R.layout.drag_item_recycler_view, this, false);
    recyclerView.setMotionEventSplittingEnabled(false);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setVerticalScrollBarEnabled(false);
    recyclerView.setHorizontalScrollBarEnabled(false);
    recyclerView.setDragItemListener(new DragItemRecyclerView.DragItemListener() {
        private int mDragStartPosition;

        @Override
        public void onDragStarted(int itemPosition, float x, float y) {
            getParent().requestDisallowInterceptTouchEvent(true);
            mDragStartPosition = itemPosition;
            if (mDragListListener != null) {
                mDragListListener.onItemDragStarted(itemPosition);
            }
        }

        @Override
        public void onDragging(int itemPosition, float x, float y) {
        }

        @Override
        public void onDragEnded(int newItemPosition) {
            if (mDragListListener != null) {
                mDragListListener.onItemDragEnded(mDragStartPosition, newItemPosition);
            }
        }
    });
    return recyclerView;
}

public RecyclerView getRecyclerView() {
    return mRecyclerView;
}

public DragItemAdapter getAdapter() {
    if (mRecyclerView != null) {
        return (DragItemAdapter) mRecyclerView.getAdapter();
    }
    return null;
}

public void setAdapter(DragItemAdapter adapter, boolean hasFixedItemSize) {
    mRecyclerView.setHasFixedSize(hasFixedItemSize);
    mRecyclerView.setAdapter(adapter);
    adapter.setDragEnabled(mDragEnabled);
    adapter.setDragStartedListener(new DragItemAdapter.DragStartedListener() {
        @Override
        public void onDragStarted(View itemView, long itemId) {
            mRecyclerView.onDragStarted(itemView, itemId, mTouchX, mTouchY);
        }
    });
}

public void setLayoutManager(RecyclerView.LayoutManager layout) {
    mRecyclerView.setLayoutManager(layout);
}

public void setDragListListener(DragListListener listener) {
    mDragListListener = listener;
}

public boolean isDragEnabled() {
    return mDragEnabled;
}

public void setDragEnabled(boolean enabled) {
    mDragEnabled = enabled;
    if (mRecyclerView.getAdapter() != null) {
        ((DragItemAdapter) mRecyclerView.getAdapter()).setDragEnabled(mDragEnabled);
    }
}

public void setCustomDragItem(DragItem dragItem) {
    removeViewAt(1);

    DragItem newDragItem;
    if (dragItem != null) {
        newDragItem = dragItem;
    } else {
        newDragItem = new DragItem(getContext());
    }

    newDragItem.setCanDragHorizontally(mDragItem.canDragHorizontally());
    newDragItem.setSnapToTouch(mDragItem.isSnapToTouch());
    mDragItem = newDragItem;
    mRecyclerView.setDragItem(mDragItem);
    addView(mDragItem.getDragItemView());
}

public boolean isDragging() {
    return mRecyclerView.isDragging();
}

public void setCanDragHorizontally(boolean canDragHorizontally) {
    mDragItem.setCanDragHorizontally(canDragHorizontally);
}

public void setSnapDragItemToTouch(boolean snapToTouch) {
    mDragItem.setSnapToTouch(snapToTouch);
}

public void setCanNotDragAboveTopItem(boolean canNotDragAboveTop) {
    mRecyclerView.setCanNotDragAboveTopItem(canNotDragAboveTop);
}

public void setScrollingEnabled(boolean scrollingEnabled) {
    mRecyclerView.setScrollingEnabled(scrollingEnabled);
}
}
protected override IContextMenuContextMenuInfo ContextMenuInfo
    {
        get
        {
            IContextMenuContextMenuInfo menuInfo = base.ContextMenuInfo;
            if (menuInfo == null)
            {
                IListAdapter adapter = Adapter;
                int pos = GetPositionForView(selectedView);
                menuInfo = new AdapterContextMenuInfo(selectedView, pos, adapter.GetItemId(pos));
            }
            return menuInfo;
        }
    }


public void OnLongPress(MotionEvent e){
        int position = PointToPosition(mDownX, mDownY);
        int itemNum = position - FirstVisiblePosition;
        selectedView = GetChildAt(itemNum); //class variable
...
}