Intereting Posts
Android: объединение текста и изображения на Button или ImageButton Где Android хранит версию базы данных SQLite? ViewPager + FragmentStatePagerAdapter + изменение ориентации Можем ли мы ограничить количество символов в редакторе SearchView в Android? Ошибка GoogleJsonResponseException: 404 не найден с использованием брандмауэра конечной точки приложения google Как использовать Smack 4.2 для подключения к ejabberd? Как обновить таблицу с помощью activeandroid после добавления нового столбца Использование ListView для создания экрана настроек в Android? Получить имя файла после того, как filereader асинхронно загрузил файл Событие Android-ключа для задней клавиши, когда отображается мягкая клавиатура? Можете ли вы устанавливать даты в андроид Как я могу интегрировать Facebook LoginButton в PreferenceScreen Как выделить выделенный элемент в ListView? Тип ввода = цифровая клавиатура отключена в Galaxy Tab Как заблокировать диалог оповещения о закрытии кнопки «Назад»

Как вы можете прослушивать события щелчка в ListView, которые происходят за пределами элементов списка?

У меня есть ListView который занимает весь экран, но иногда он не имеет достаточного количества элементов, чтобы полностью покрыть виджет ListView . Я хотел бы иметь возможность реагировать на клики на этом пустом пространстве ниже последнего элемента, который фактически не содержит элемент (это означает, что setOnItemClickListener не подходит).

Я попытался setOnClickListener (который они отключили для самого ListView ) в родительском представлении, но клики, похоже, не достигают этого. Я также попробовал setOnTouchListener в ListView , но из-за этого некоторые клики по каким-то причинам не регистрировались. Любые идеи о том, как это сделать?

Solutions Collecting From Web of "Как вы можете прослушивать события щелчка в ListView, которые происходят за пределами элементов списка?"

Изначально возникла аналогичная проблема, когда мне нужно было закрыть расширенные элементы списка при щелчке по пустому пространству. Вот как я это решил.

 public class CustomListView extends ListView { private OnNoItemClickListener mOnNoItemClickListener; public interface OnNoItemClickListener { void onNoItemClicked(); } public CustomListView(Context context) { super(context); } public CustomListView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { //check whether the touch hit any elements INCLUDING ListView footer if(pointToPosition((int) (ev.getX() * ev.getXPrecision()), (int) (ev.getY() * ev.getYPrecision())) == -1 && ev.getAction() == MotionEvent.ACTION_DOWN) { if(mOnNoItemClickListener != null) { mOnNoItemClickListener.onNoItemClicked(); } } return super.dispatchTouchEvent(ev); } public void setOnNoItemClickListener(OnNoItemClickListener listener) { mOnNoItemClickListener = listener; } } 

Затем используйте этот CustomListView в XML-файле вместо обычного ListView и реализуйте OnNoItemClickListener внутри вашей активности / фрагмента и вызовите mListView.setOnNoItemClickListener (this); In onCreate, чтобы включить обратный вызов функции onNoItemClicked ().

Обратите внимание, что если ваш ListView имеет верхние или нижние колонтитулы, они считаются элементами списка, а onNoItemClicked () не будут вызываться.

Один из возможных способов достижения этого – установить ListView в height="wrap_content" Если вы это сделаете, вы можете переопределить onTouchEvent() для своей активности, чтобы получить события, когда пользователь коснется пустого пространства.

layout.xml

 <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/list" /> 

Activity.java

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView mList = (ListView)findViewById(R.id.list); mList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos,long id) { Toast.makeText(v.getContext(), ""+pos, Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onTouchEvent(MotionEvent me){ if(me.getAction() == MotionEvent.ACTION_DOWN){ Toast.makeText(this, "Empty space", Toast.LENGTH_SHORT).show(); return true; } return false; } } 

Однако, если вы рассчитываете, что высота ListView будет соответствовать match_parent по какой-либо причине (то есть фоновая возможность), это не будет идеальным решением.

Вот пример, как я это сделал: https://github.com/mmokrzycki/listview-with-clickable-empty-view

Поместите пустую линейную паузу под списком, установив соответствующую высоту в listview. Поместите метод onClick () в этот линейный макет. Это должно сделать это.

Объединив некоторые другие ответы, я придумал это, что хорошо работает для моего случая использования

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... setup list view and other view state listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN && listView.pointToPosition((int) (event.getX() * event.getXPrecision()), (int) (event.getY() * event.getYPrecision())) == -1) { collapseExpandedListItem(); return true; } return false; } }); }