Почему мой прослушиватель onitemlongclick не работает?

Из MainActivity:

public class MainActivity extends ListActivity implements AdapterView.OnItemLongClickListener {
    private DataSourceSql mDataSourceSql;
    protected ArrayList<String> mProfileNames;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDataSourceSql = new DataSourceSql(MainActivity.this);
        mNames = new ArrayList<String>();

        //this part here
        ListView lv = (ListView) findViewById(android.R.id.list);
        lv.setLongClickable(true);
    }

Идентификатор ListView в этом случае устанавливается в XML как android:id="@android:id/list".

А затем позже в том же действии:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Toast.makeText(this, mNames.get(position), Toast.LENGTH_SHORT).show();
}

@Override
public boolean onItemLongClick(AdapterView<?> l, View v, final int position, long id) {
    Toast.makeText(this, "long clicked: " + mNames.get(position), Toast.LENGTH_LONG).show();
    return true;
}

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


person user6101402    schedule 23.03.2016    source источник
comment
Я предполагаю, что длинный щелчок = нажмите и удерживайте (я хочу иметь возможность удерживать элемент в списке и получать больше параметров)   -  person user6101402    schedule 23.03.2016
comment
Вам нужно позвонить lv.setOnLongClickListener(this).   -  person Mike M.    schedule 23.03.2016
comment
@МайкМ. Является ли мой ответ неправильным/плохой практикой?   -  person user6101402    schedule 23.03.2016
comment
stackoverflow.com/a/6703671/3790150   -  person saeed    schedule 23.03.2016
comment
stackoverflow.com/a/20932220/3790150 попробуйте это   -  person saeed    schedule 23.03.2016
comment
@МайкМ. Другими словами, я могу просто сохранить то, что у меня есть в OP, и добавить строку lv.setOnLongClickListener(this)?   -  person user6101402    schedule 23.03.2016
comment
@МайкМ. Я делаю это во время метода updateList, который я вызываю во время onResume, и после завершения функции, которая вставляет новые элементы в базу данных, которая приводит в действие список.   -  person user6101402    schedule 23.03.2016


Ответы (3)


Вы не должны реализовывать интерфейс, такой как AdapterView.OnItemLongClickListener, непосредственно в вашем onCreate().. Просто используйте свой старый способ (ваш класс реализует этот интерфейс), и с каждым переопределением метода вы должны писать так:

lv.setOnItemLongClickListener(this);
lv.setonListItemLongClickListener(this);
person Bui Quang Huy    schedule 23.03.2016

Я думаю, что понял это, но кто-нибудь, пожалуйста, поправьте меня, если я что-то упустил.

Я удалил "реализует...", а затем добавил в метод onCreate следующее:

lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener
                () {
            @Override
            public boolean onItemLongClick(AdapterView<?> av, View v, int
                    pos, long id) {
                onListItemLongClick(v, pos, id);
                return false;
            }
        });

Хотя я не уверен, должен ли я возвращать там true или false.

Я также изменил функцию длинного щелчка внизу на

public boolean onListItemLongClick(View v, final int position, long id) {
    Toast.makeText(this, "long clicked: " + mNames.get(position), Toast.LENGTH_LONG).show();
    return true;
}

Редактировать:

Более быстрый подход — просто добавить lv.setOnItemLongClickListener(this); к моему методу onCreate в OP.

person user6101402    schedule 23.03.2016
comment
Если ваш Activity реализует интерфейс OnItemLongClickListener, вы просто вызываете lv.setOnItemLongClickListener(this); - person Zamrony P. Juhara; 23.03.2016

Использовать это. Ваша проблема будет решена.

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "Click", Toast.LENGTH_SHORT).show();
            }
        });
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                Toast.makeText(MainActivity.this, "Long Click", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
person Mehul Santoki    schedule 23.03.2016