Android создание всплывающего диалогового окна при длительном нажатии на элемент listview

#android #listview #popup

#Android #listview #всплывающее

Вопрос:

Я немного запутался, как обрабатывать длинный щелчок по отдельному элементу listview, а затем показывать всплывающее окно для элемента.

Итак, вот мой код, пожалуйста, задайте несколько вопросов, если вы чего-то не понимаете.

MainActivity.java

 ListView listView = (ListView) findViewById(R.id.listView);

listView.setOnLongClickListener(new View.OnLongClickListener() {
            @SuppressLint("ResourceType")
            @Override
            public boolean onLongClick(View v) {
                PopupMenu p = new PopupMenu(MainActivity.this, v);
                p.getMenuInflater().inflate(R.layout.popup_layout, p.getMenu());
                p.show();
                return true;
            }
        });
  

popup_layout.xml

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <menu
        android:layout_width="185dp"
        android:layout_height="141dp"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="96dp"
        tools:layout_editor_absoluteY="83dp">

        <item
            android:id="@ id/order_takeout"
            android:onClick="doTakeOut"
            android:title="@string/order_takeout"
            android:layout_width="delete" />

        <item
            android:id="@ id/order_eat_in"
            android:onClick="doEatIn"
            android:title="@string/edit" />
    </menu>
</androidx.constraintlayout.widget.ConstraintLayout>
  

viewcontents_layout.xml

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@ id/listView"
        android:layout_width="409dp"
        android:layout_height="729dp"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp"
        android:longClickable="true"
        tools:ignore="MissingConstraints"/>

</androidx.constraintlayout.widget.ConstraintLayout>
  

Если кто-нибудь может мне помочь, я очень рад получить ответ.
Будьте здоровы!

Ответ №1:

ваша ошибка setOnLongClickListener в том, что вы можете использовать :

 listView.setOnItemLongClickListener(new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int pos, long id) {


            return true;
        }
    }); 
  

Комментарии:

1. Если я это сделаю, я получу сообщение об ошибке (new AdapterVie.onItemLongClickListener) Класс ‘Анонимный класс, производный от OnLongClickListener’, должен быть либо объявлен абстрактным, либо реализовать абстрактный метод ‘onLongClick (View)’ в ‘OnLongClickListener’ Говорится, что я должен использовать общедоступный логический onLongClick (View v) Возможно, другое решение вашей стороны?

2. Теперь я получаю исключение: попытка вызвать виртуальный метод void android.widget. ListView.setOnItemLongClickListener(android.widget. AdapterView$OnItemLongClickListener)’ на нулевую ссылку на объект в следующей строке: listView.setOnItemLongClickListener(new OnItemLongClickListener() {

Ответ №2:

Итак, я решил проблему.

  1. Используя другой класс Java с именем ViewListContents и изменив место, где находится мой popup_layout, я переместил его в меню и установил некоторые теги меню, а не теги ограничений.

  2. Я изменил R.layout на R.menu в моем onItemLongClickListener

В этом классе я использовал его следующим образом:

     listView = (ListView) findViewById(R.id.listView);

    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
            PopupMenu p = new PopupMenu(ViewListContents.this, v);
            MenuInflater inflater = p.getMenuInflater();
            inflater.inflate(R.menu.popup_layout, p.getMenu());
            p.show();
            return true;
        }
    });