Android的GridView控件OnItemLongClick监听OnItemClick之后调用

2019-08-18 06:39发布

基本上我想显示不同的上下文菜单时就在网格视图中的小区中的用户短点击或长点击。 我的问题是,如果用户点击短的OnItemClick监听器被调用,我看到调试器到达显示上下文菜单,但不是从那里转移到onCreateContextMenu它去onItemLongClick代码。

我一直在使用一个布尔值来防止被执行的长按代码确实防止被执行的代码试过,但即使这样做onCreateContextMenu不叫的。

如果我删除onItemLongClick监听短点击监听器工作正常,并在上下文菜单中显示正确。

我知道其他人都问过类似这样的问题,但我还没有能够找到一个可行的解决方案。 如果有人能解决这个或点我在正确的方向,请让我知道,在此先感谢。 赏金将颁发给任何人谁,甚至可以点我在正确的方向。

这是听众的代码的简化版本:

        mTGrid.setOnItemClickListener(new OnItemClickListener() {
            //this listener should show the context menu for a short click on the gridview.
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                    mRequiredMenu = "standard";
                    parent.showContextMenuForChild(v);      

            }
        });

        mTGrid.setOnItemLongClickListener(new OnItemLongClickListener() {
            //this listener should show the context menu for a long click on the gridview.
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
                    mRequiredMenu = "options";
                        parent.showContextMenuForChild(v);      

            }
        });

Answer 1:

我知道你想显示在一个GridView项目短点击,长点击不同的上下文菜单。

首先,你只需要设置监听以来的默认行为会自动显示在长点击右键菜单短按一下。

接下来,在OnItemClickListener设置一个布尔标志设置为true。 默认值是长期的点击假的。

最后,在onCreateContextMenu()检查,如果其短按一下,并显示不同的上下文菜单(标准),并设置标志设置为false。 否则让它显示默认的上下文菜单(选项)。

下面是一些代码验证这个想法。

public class MainActivity extends Activity {

    private static final String[] arr = {"A", "B", "C", "D", "E", "F", "G", "H","I"};

    private GridView mTGrid;
    private boolean isShort;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTGrid = (GridView) findViewById(R.id.gridView1);
        registerForContextMenu(mTGrid);

        mTGrid.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                isShort = true;
                openContextMenu(view);
            }
        });

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.cell, arr);
        mTGrid.setAdapter(adapter);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;

        if(isShort) {
            getMenuInflater().inflate(R.menu.context_standard, menu);
            menu.setHeaderTitle("Standard Menu for "+arr[info.position]);
            isShort = false;
        }
        else {
            getMenuInflater().inflate(R.menu.context_options, menu);
            menu.setHeaderTitle("Options Menu for "+arr[info.position]);
        }
    }   
}

示例应用程序 :你可以下载一个示例应用程序来看到的行为。 GridExample_eclipse_project



Answer 2:

对于绝望的处境绝望的解决方案。

1.Try与布尔工作,而不是听众中执行代码。

 mTGrid.setOnItemClickListener(new OnItemClickListener() {
        //this listener should show the context menu for a short click on the gridview.
        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                b=true     
        }
    });

    mTGrid.setOnItemLongClickListener(new OnItemLongClickListener() {
        //this listener should show the context menu for a long click on the gridview.
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
                b=false      
        }
    });
if(b)
{
     mRequiredMenu = "standard";
     parent.showContextMenuForChild(v);  
}
else
{
    mRequiredMenu = "options";
    parent.showContextMenuForChild(v);
}

2检查如果同时点击和longclickable性质的布局是“真”。



Answer 3:

您可以在此改变调度事件监听器是resposible为长按操作



Answer 4:

mTGrid.setOnItemClickListener(new OnItemClickListener() {
            //this listener should show the context menu for a short click on the gridview.
            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                     clickFlag=true;   
                     mRequiredMenu = "standard";                     

            }
        });

        mTGrid.setOnItemLongClickListener(new OnItemLongClickListener() {
            //this listener should show the context menu for a long click on the gridview.
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
                     clickFlag=false;
                     mRequiredMenu = "options";                  
            }
        });

if(clickFlag){        
    if(mRequiredMenu.equals("standard");{
        //just click event
        parent.showContextMenuForChild(v);
    }else{}
}else{
   if(mRequiredMenu.equals("options");{
        //just Long click event
        parent.showContextMenuForChild(v);
    }else{} 

}


Answer 5:

OnItemLongClickListener被触发,因为显示的上下文菜单中ListView将尝试通过监听器这样做。 下面是从代码AbsListView

@Override
public boolean showContextMenuForChild(View originalView) {
    final int longPressPosition = getPositionForView(originalView);
    if (longPressPosition >= 0) {
        final long longPressId = mAdapter.getItemId(longPressPosition);
        boolean handled = false;

        if (mOnItemLongClickListener != null) {
            handled = mOnItemLongClickListener.onItemLongClick(AbsListView.this, originalView,
                    longPressPosition, longPressId);
        }
        if (!handled) {
            mContextMenuInfo = createContextMenuInfo(
                    getChildAt(longPressPosition - mFirstPosition),
                    longPressPosition, longPressId);
            handled = super.showContextMenuForChild(originalView);
        }

        return handled;
    }
    return false;
}

从这一点,我们可以看到,如果mOnItemLongClickListener.onItemLongClick返回true,那么表示该呼叫处理和方法退出。 如果返回false,那么它会尝试创建上下文菜单。

所以,你需要修改你的回报声明onItemLongClick (你的代码没有显示),如果它是很长的点击,返回 ,如果它只是点击:

mTGrid.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

        mRequiredMenu = "standard";
        mItemClicked = true;
        parent.showContextMenuForChild(v);
    }
});

mTGrid.setOnItemLongClickListener(new OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {

        if(mItemClicked) {
            mItemClicked = false;
            return false;
        }

        mRequiredMenu = "options";
        parent.showContextMenuForChild(v);
        return true;
    }
});


文章来源: Android GridView OnItemLongClick listener called after OnItemClick