Как я могу создать пользовательский контейнерный вид в Android?

Я хотел бы создать представление с прослушивателем, который действует как контейнер или продуктовый мешок. Любое изображение или текст, которые втянуты в него, собираются и сохраняются в локальной базе данных. Вернее, имя или строка изображения сохраняются. Я создал пользовательские представления перед тем, как отобразить пользовательскую строку данных, но я не уверен, как создать тип «продуктовой сумки». Я искал Google для создания пользовательского представления контейнера со слушателем, но не смог найти ничего, что связано с тем, что я ищу. Я не прошу кого-либо сделать это для меня, просто дайте мне совет или толкните в правильном направлении.

Редактировать Просто уточнить немного больше. Я уже знаю, как перетащить представление. Проблема в том, что вы можете уйти куда угодно. То, что я хочу, – это представление, что когда что-то выпадает в пределах его границ, оно получает строку или тег представлений. Независимо от того, какой вид может быть. Каким-то образом это пользовательское представление должно знать, какой вид был сброшен в пределах его границ и удалить этот вид при удалении.

<view class="at.calista.quatscha.views.SwipebarLayout" android:id="@+id/sbl" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- Top View --> <Button android:text="Top" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <!-- Bottom View --> <Button android:text="Bottom" android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 

Вам понадобится метод, который определяет, перекрываются ли два представления. Например, что-то вроде этих методов может работать, когда целевое представление и перетаскиваемый элемент представляют собой два разных вида в одном и том же представлении контейнера:

 private Rect getScreenBounds(View view) { int[] location = new int[2]; view.getLocationOnScreen(location); return new Rect(location[0], location[1], location[0] + view.getWidth(), location[1] + view.getHeight()); } private boolean doViewsIntersect(View dropTarget, View item) { Rect dropRect = getScreenBounds(dropTarget); Rect itemRect = getScreenBounds(item); return Rect.intersects(dropRect, itemRect); } 

Однако, если перетаскиваемые представления представляют собой дочерние представления в контейнере, а в этом контейнере есть специальная область хитов, где вы хотите выполнить логику падения, тогда вы можете просто использовать Rect для области пересечения для теста пересечения.

Чтобы сохранить информацию в View , у вас есть несколько вариантов:

  • Вы можете использовать view.setTag(key, object) и view.getTag(key) для хранения любой информации, которая вам view.getTag(key) для каждого элемента.
  • Если вы используете пользовательский класс для элементов, вы можете просто добавить метод для получения данных из класса представления.
  • Если вы используете несколько разных классов для элементов, вы можете создать интерфейс и реализовать этот интерфейс для каждого класса просмотра с перетаскиванием.

При выпуске элемента вы можете проверить, пересекаются ли области / представления, и если они это делают, получить необходимую информацию из перетаскиваемого элемента для обработки по мере необходимости, используя getTag или метод, добавленный в представление.

Например, это может быть вызвано с помощью onTouchListener , когда вы получаете событие MotionEvent.ACTION_UP . Вот пример слушателя, который вы можете добавить на каждый элемент:

 item.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP) { if (doViewsIntesect(dropTarget, v)) { Object data = v.getTag(DATA_KEY); //process data ((ViewGroup) v.getParent()).removeView(v); // to remove the item afterwards } } return false; } });