带有 CustomAdapter 的 Listview 项目的上下文菜单 android 不显示

Context menu android on Listview item with CustomAdapter doesn't show

我在 Android 开发方面还很陌生,我试图在使用 CursorAdapter 的 Listview 上放置一个上下文菜单,我遵循了这个示例 https://www.youtube.com/watch?v=Pq9YQl0nfEk Using contextmenu with listview in android 但菜单没有出现我也不知道为什么,貌似一切正常。

这些是我的代码 activity

public class ProductsView extends AppCompatActivity {


    private FloatingActionButton botonAnadir;
    private ListView lvProducts;
    SetOfProductList mylist;
    private ProductAdapter productAdapter;
    Cursor cursor;
    private ProductList productList;
    private Long idProductList;
    private DBManager dbManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle bundle = getIntent().getExtras();
        if (bundle != null){
            productList = bundle.getParcelable("productList");
            setTitle(getResources().getString(R.string.show_products) + " " + productList.getName());
        }
        setContentView(R.layout.products_view);
        initialize();
    }
    private void initialize(){
        botonAnadir = (FloatingActionButton)findViewById(R.id.button_add_product);
        lvProducts = (ListView)findViewById(R.id.listViewProducts);
        dbManager = new DBManager(getApplicationContext());
        loadProducts();
        registerForContextMenu(lvProducts);

        botonAnadir.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                creaNuevaLista();
            }
        });

        lvProducts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Product aux = getProduct(position);
                goToNewProduct(aux);
            }
        });

        lvProducts.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                // markAsPurchased(position);
                return true;

            }
        });

    }

    private void markAsPurchased(int position){
        Product p = getProduct(position);
        TextView item = (TextView) findViewById(R.id.textview_product_name);

        if (p.getPurchased() == 0){
            p.setPurchased(1);  //mark as a purchased
            item.setPaintFlags(item.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        }
        else{
            p.setPurchased(0);  //mark as a purchased
            item.setPaintFlags(item.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
        }
        editProduct(p); //makes de update
        loadProducts();
    }

    private void editProduct(Product product){
        dbManager.updateProduct(product);
    }

    private void goToNewProduct(Product p){
        Intent intent = new Intent(this,NewProductActivity.class);
        Bundle b = new Bundle();
        b.putBoolean("editMode",true);
        b.putParcelable("product", p);
        intent.putExtras(b);
        startActivity(intent);
    }

    private void creaNuevaLista(){
        Intent i = new Intent(this,NewProductActivity.class);
        Bundle b = new Bundle();
        b.putParcelable("productList", productList);
        i.putExtras(b);
        startActivityForResult(i, 0);

    }

    private void loadProducts(){
        cursor = dbManager.getAllProductsWithCursor(productList);
        productAdapter = new ProductAdapter(this,cursor);
        lvProducts.setAdapter(productAdapter);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        if (v.getId() == R.id.listViewProducts){
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.prodcut_view_context_menu,menu);
        }

    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()){
            case R.id.delete_id:
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
}

这是我正在使用的适配器

 public class ProductAdapter extends CursorAdapter {
    private LayoutInflater inflater;


    //Constructor
    public ProductAdapter(Context context, Cursor cursor) {
        super(context, cursor,false);
    }

    // The newView method is used to inflate a new view and return it,
    // you don't bind any data to the view at this point.
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.layout_product_row,parent,false);
        return view;
    }

    // The bindView method is used to bind all data to a given view
    // such as setting the text on a TextView.
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView tv_product_name = (TextView) view.findViewById(R.id.textview_product_name); // Find fields to populate in inflated template
        String product_name = cursor.getString(cursor.getColumnIndexOrThrow("name"));// Extract properties from cursor
        // Populate fields with extracted properties
        tv_product_name.setText(product_name);
        if (cursor.getInt(cursor.getColumnIndexOrThrow("purchased")) == 1){
            tv_product_name.setPaintFlags(tv_product_name.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        }
    }

    public Product getProduct(int position, Cursor cursor) {
        Product p=null;
        if(cursor.moveToPosition(position)) {
            Log.e("PRODUCTLISTADAPTER","nombre es: "+cursor.getString(cursor.getColumnIndex("name")));
            p = new Product (cursor.getLong(cursor.getColumnIndex("_id")),cursor.getString(cursor.getColumnIndex("name")),
                    cursor.getString(cursor.getColumnIndex("unit_type")),cursor.getDouble(cursor.getColumnIndex("value")),cursor.getInt(cursor.getColumnIndex("purchased")),cursor.getLong(cursor.getColumnIndex("id_pl")));
        }
        return p;
    }
}

任何人都可以解释为什么它不起作用吗?是不是有必要在 LongClickListener 上做点什么?因为我没有看到正在创建菜单。

提前致谢。

您已经为 ListView 设置了 OnItemLongClickListener,这将在创建上下文菜单之前 运行。从其 onItemLongClick() 方法返回 true 表示长按正在那里消耗,因此不会创建菜单。

如果您实际上不需要OnItemLongClickListener,您可以删除相关代码。如果您确实也需要它,出于某种原因,您可以从 onItemLongClick() return false,然后您的菜单将显示。