Как сделать пользовательское контекстное меню для ListItem (как в Baconreader)? - PullRequest
1 голос
/ 16 декабря 2011

Так что я заинтересован в создании настраиваемого контекстного меню для каждого из моих элементов списка, когда на них долго нажимают. Я видел, как это реализовано в приложении Baconreader, и думал, что это будет так просто:

  1. Создание одного LinearLayout (или чего бы то ни было) при заполнении списка
  2. При длительном нажатии на элемент скрыть его (View.GONE) и добавить LinearLayout к родительскому элементу списка.
  3. При необходимости покажите элемент списка и удалите LinearLayout из его родителя.

Мне удалось скрыть элементы списка наItemLongClick, но оказалось, что вы не можете добавить Views в ListView (не так). Но это должно быть способ, которым Baconreader делает это. Я не могу понять это. Вот некоторый код, который я пробовал:

listView.setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0,
        View arg1, int arg2, long arg3) {
             arg1.setVisibility(View.GONE); // hide the list item, works

             // trying to add a TextView after a list
             // item's position, doesn't work.
             listView.addView(textView, arg2);

             return true;
    }
});

Вот пример того, как это должно выглядеть: A screenshot from my lovely Nexus S

Таким образом, элемент списка скрыт и пользовательское контекстное меню (похоже на ViewGroup) размещается непосредственно над позицией элемента списка. Но как?

Редактировать: Решено. Обновленный код:

list_item.xml

    <TextView
        android:id="@+id/list_item_title"
        .....
     />

</FrameLayout>

Java-код

listView.setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0,
        View arg1, int arg2, long arg3) {
             ((FrameLayout)arg1).addView(w);
             return true;
    }
});

И, конечно, вы должны использовать SimpleAdapter вместо ArrayAdapter.

1 Ответ

2 голосов
/ 16 декабря 2011

Просто быстрый совет: что, если вы не скрываете элемент списка и не добавляете контекстное меню в список, а вместо этого добавляете контекстное меню в элемент списка?

Например, обернуть текущий макет элемента списка в FrameLayout. Затем при длинном щелчке просто добавьте контекстное меню к этому FrameLayout вместо этого? (и при необходимости скрыть первого потомка FrameLayout). Это также гарантирует, что контекстное меню будет иметь тот же размер, что и элемент списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...