Topic: ListActivity

Обсуждение статьи ListActivity - создаём прокручиваемый список

Re: ListActivity

Здравствуйте! У меня проблема с длинным нажатием. Я использую Android Studio c Geny Motion вместо встроенного эмулятора, и у меня возникает такая проблема. Я скопировал Ваш код, но там вот что: когда я просто нажимаю на какой-либо элемент, всплывает всплывающее сообщение (это правильно), но когда я держу нажатие несколько секунд (продержал даже 30), то вызывается не события для долговременного нажатия, а просто OnListItemClick. Поставил брейкпоинты, по-любому идет в OnListItemClick. В чем может быть проблема? Заранее благодарю за ответ

Re: ListActivity

У ListActivity нет метода для длительного нажатия. Поэтому вам нужно получить сам ListView и в нем уже реализовать нужный метод. Приблизительно так.
ListView lv = getListView(); // получим ListView
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) {
        // your code
    }
});

Re: ListActivity

Понятно, спасибо большое!

Re: ListActivity

public class TrenirovkaFragment extends ListFragment  {
    ArrayAdapter<Spisok> arrayAdapter;
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        arrayAdapter =new ArrayAdapter<>(getActivity(),android.R.layout.simple_list_item_1, Spisok.listSpisok);
        setListAdapter(arrayAdapter);
        ListView listView = getListView();
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                String name = parent.getItemAtPosition(position).toString();
             
ЧТО ЗДЕСЬ НАПИСАТЬ ЕСЛИ ПРОСИТЬСЯ В ВИДЕ АРГКМЕНТА ДЛЧ УДАЛЕНИЯ



                Toast.makeText(getActivity(),
                        name + " удалён.",
                        Toast.LENGTH_SHORT).show();
                return true;
            }
        });

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(getActivity(), Exercise.class);
                startActivity(intent);

            }
        });


    }



}

как для такого варианта написать удаление из списка?

Re: ListActivity

Добрый день.
1) Не пойму никак, как интерфейс правильно реализовывать. Если делаю так:

package nefersky.listactivityapp;
/* в сообщении импорты убрал */

public class MainActivity extends ListActivity implements AdapterView.OnItemLongClickListener {
    final String[] catNamesArray = new String[]{"Рыжик", "Барсик", "Мурзик", "Мурка", "Васька", "Томасина", 

        "Бобик", "Кристина", "Пушок", "Дымка", "Кузя", "Китти", "Барбос", "Масяня", "Симба"};
    private ArrayList<String> catNamesList = new ArrayList<>(Arrays.asList(catNamesArray));
    private ArrayAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, catNamesList);
        setListAdapter(mAdapter);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id){
        super.onListItemClick(l, v, position, id);
        Toast.makeText(getApplicationContext(), "Выбран элемент " + l.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        String selectedItem = parent.getItemAtPosition(position).toString();
        mAdapter.remove(selectedItem);
        mAdapter.notifyDataSetChanged();
        Toast.makeText(getApplicationContext(), "Удален элемент " + selectedItem, Toast.LENGTH_SHORT).show();
        return true;
    }
}

то получаю ситуацию как у xazratbek - длинное нажатие не обрабатывается.

А если делаю так:

package nefersky.listactivityapp;
/* в сообщении импорты убрал */

public class MainActivity extends ListActivity implements AdapterView.OnItemLongClickListener {
    final String[] catNamesArray = new String[]{"Рыжик", "Барсик", "Мурзик", "Мурка", "Васька", "Томасина", 
        "Бобик", "Кристина", "Пушок", "Дымка", "Кузя", "Китти", "Барбос", "Масяня", "Симба"};
    private ArrayList<String> catNamesList = new ArrayList<>(Arrays.asList(catNamesArray));
    private ArrayAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = getListView();
        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                String selectedItem = parent.getItemAtPosition(position).toString();
                mAdapter.remove(selectedItem);
                mAdapter.notifyDataSetChanged();
                Toast.makeText(getApplicationContext(), "Удален элемент " + selectedItem, Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, catNamesList);
        setListAdapter(mAdapter);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id){
        super.onListItemClick(l, v, position, id);
        Toast.makeText(getApplicationContext(), "Выбран элемент " + l.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
    }
}

то студия ругается на строку "public class MainActivity extends ListActivity implements AdapterView.OnItemLongClickListener", что "class 'MainActivity' must either be declared abstract or implement abstract method 'onItemLongClick(AdapterView<?>, View, int, long)' in OnItemLongClickListener'". При этом если убрать "implements AdapterView.OnItemLongClickListener" - то все работает исправно. Как, все-таки, надо делать?


2) Если список занимает не весь экран, то под ним (списком) находится textView "List is empty" - это так и должно быть?

Re: ListActivity

NeferSky: для первого случая вам просто нужно дописать одну строчку кода в метод onCreate:
      getListView().setOnItemLongClickListener(this);       

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

        mAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, catNamesList);
        setListAdapter(mAdapter);
        getListView().setOnItemLongClickListener(this);       
    }

Автор, не указал в тексте что нужно добавить данную строчку. Но в исходном коде она есть.

Во втором случае, не нужно делать implements AdapterView.OnItemLongClickListener, либо нужно реализовать обязательный метод onItemLongClick который наследуется от интерфейса AdapterView.OnItemLongClickListener

Re: ListActivity

А как подключать свой layout если использовать ConstraintLayout?
Как только добавляю строку -  setContentView(R.layout.activity_customlist); - в эмуляторе ошибка...

Re: ListActivity

Читайте свои ошибки в студии и устраняйте их.

Re: ListActivity

alexander.klimoff wrote:

Читайте свои ошибки в студии и устраняйте их.

В том то и дело, что не могу найти... layout, все отображает, id вроде правильные...

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00FF00">
    </ListView>

    <TextView
        android:id="@+id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/isEmpty" />

</android.support.constraint.ConstraintLayout>

Re: ListActivity

Как вы понимаете фразу "читайте свои ошибки"? Где вы их читаете?
Что касается ListActivity, то id у вас неправильные. И в статье об этом говорится.

12 (edited by kirill_nn 2017-12-11 22:36:20)

Re: ListActivity

alexander.klimoff wrote:

Как вы понимаете фразу "читайте свои ошибки"? Где вы их читаете?
Что касается ListActivity, то id у вас неправильные. И в статье об этом говорится.

Блин... Александр, простите меня не недостаточную внимательность...

В шаблоне нужно разместить ListView с обязательным идентификатором @id/android:list. Компонент TextView будет показан в том случае, если нет данных для списка. Он также должен иметь обязательный идентификатор @id/android:empty.

PS Урок по ListFragment - помогла смена импорта с
import android.support.v4.app.ListFragment;
на
import android.app.ListFragment;
Зеленые человечки опять развлекаются :-)

13 (edited by tuta 2017-12-23 22:05:29)

Re: ListActivity

Здравствуйте!
Попытался сделать Snackbar с кнопкой отмены удаления элемента, не выходит. Ругается на строки:

snackbar.setAction("Отменить", snackbarOnClickListener.onClick(selectedItem)); // onClick(android.view.View) in OnClickListener cannot be applied to (java.lang.String)
View.OnClickListener snackbarOnClickListener = new View.OnClickListener() { //Class 'Anonymous class derived from OnClickListener' must either be declared abstract or implement abstract method 'onClick(View)' in 'OnClickListener'

Вот весь код:

package com.example.andrei.listactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.support.design.widget.Snackbar;

import java.util.ArrayList;
import java.util.Arrays;


public class MainActivity extends ListActivity implements AdapterView.OnItemLongClickListener {

    final String[] catNamesArray = new String[]{"Рыжик", "Барсик", "Мурзик",
            "Мурка", "Васька", "Томасина", "Бобик", "Кристина", "Пушок",
            "Дымка", "Кузя", "Китти", "Барбос", "Масяня", "Симба"};

    private ArrayAdapter<String> mAdapter;
    private ArrayList<String> catNamesList = new ArrayList<>(Arrays.asList(catNamesArray));


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

        mAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, catNamesList);
        setListAdapter(mAdapter);
        getListView().setOnItemLongClickListener(this);

    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        Toast.makeText(getApplicationContext(),
                "Вы выбрали " + l.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        String selectedItem = parent.getItemAtPosition(position).toString();

        mAdapter.remove(selectedItem);
        mAdapter.notifyDataSetChanged();

        Snackbar snackbar = Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG);
        snackbar.setAction("Отменить", snackbarOnClickListener.onClick(selectedItem));
        snackbar.setDuration(4500); // 4.5 секунды
        snackbar.show();
        return true;
    }

    View.OnClickListener snackbarOnClickListener = new View.OnClickListener() {
        public void onClick(String removedString) {
            mAdapter.add(removedString);
            mAdapter.notifyDataSetChanged();
        }
    };
}

Re: ListActivity

tuta wrote:

Здравствуйте!
Попытался сделать Snackbar с кнопкой отмены удаления элемента, не выходит. Ругается на строки:

snackbarOnClickListener.onClick() принимает объект View, а не String

Перенесите объявление переменной selectedItem в члены класса. В функции onItemLongClick будет тогда просто selectedItem = parent.getItemAtPosition(position).toString();

обработчик снакбара:

View.OnClickListener snackbarOnClickListener = new View.OnClickListener() {
        public void onClick(View view) {
            mAdapter.add(selectedItem);
            mAdapter.notifyDataSetChanged();
        }
    };

Метод add добавляет в конец списка. Если нужно вернуть удаленный элемент на тоже место, то нужно использовать mAdapter.insert(selectedItem, index);

Где index объявляется как член класса, а инициализируется в onItemLongClick аргументом position