Topic: ListActivity
Обсуждение статьи ListActivity - создаём прокручиваемый список
Все вопросы проплачены кошками - всемирно известными производителями котят
You are not logged in. Please login or register.
Для регистрации на форуме следует написать мне письмо. В ответе я напишу правильный ответ для прохождения регистрации.
Форум Александра Климова → Android → ListActivity
Обсуждение статьи ListActivity - создаём прокручиваемый список
Здравствуйте! У меня проблема с длинным нажатием. Я использую Android Studio c Geny Motion вместо встроенного эмулятора, и у меня возникает такая проблема. Я скопировал Ваш код, но там вот что: когда я просто нажимаю на какой-либо элемент, всплывает всплывающее сообщение (это правильно), но когда я держу нажатие несколько секунд (продержал даже 30), то вызывается не события для долговременного нажатия, а просто OnListItemClick. Поставил брейкпоинты, по-любому идет в OnListItemClick. В чем может быть проблема? Заранее благодарю за ответ
У ListActivity нет метода для длительного нажатия. Поэтому вам нужно получить сам ListView и в нем уже реализовать нужный метод. Приблизительно так.
ListView lv = getListView(); // получим ListView
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int row, long arg3) {
// your code
}
});
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);
}
});
}
}
как для такого варианта написать удаление из списка?
Добрый день.
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" - это так и должно быть?
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
А как подключать свой layout если использовать ConstraintLayout?
Как только добавляю строку - setContentView(R.layout.activity_customlist); - в эмуляторе ошибка...
Читайте свои ошибки в студии и устраняйте их.
В том то и дело, что не могу найти... 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>
Как вы понимаете фразу "читайте свои ошибки"? Где вы их читаете?
Что касается ListActivity, то id у вас неправильные. И в статье об этом говорится.
Как вы понимаете фразу "читайте свои ошибки"? Где вы их читаете?
Что касается ListActivity, то id у вас неправильные. И в статье об этом говорится.
Блин... Александр, простите меня не недостаточную внимательность...
В шаблоне нужно разместить ListView с обязательным идентификатором @id/android:list. Компонент TextView будет показан в том случае, если нет данных для списка. Он также должен иметь обязательный идентификатор @id/android:empty.
PS Урок по ListFragment - помогла смена импорта с
import android.support.v4.app.ListFragment;
на
import android.app.ListFragment;
Зеленые человечки опять развлекаются :-)
Здравствуйте!
Попытался сделать 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();
}
};
}
Здравствуйте!
Попытался сделать 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
Форум Александра Климова → Android → ListActivity
Powered by PunBB, supported by Informer Technologies, Inc.