Как отобразить новый вид при длительном нажатии на элемент в ListView?

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

Может кто-нибудь предложить какие-либо идеи для решения этой задачи!

5 ответов

Решение

Попробуй это

ссылка: Обнаружение долгого нажатия с Android

    @Override
public boolean onTouchEvent(MotionEvent event, MapView mapView){
    if(event.getAction() == MotionEvent.ACTION_DOWN)
        //hide wat u want to hide
    if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() == MotionEvent.ACTION_UP))
        //show want to show
    return super.onTouchEvent(event, mapView);
}

примечание: ссылка может уничтожить, поэтому код вставлен. в вашем переключателе onitemlongclick или onitemclick

    yourlistview.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position,
            long arg3) {

        switch (position) {

        case 0:

            final TextView t = (TextView)arg1.findViewById(R.id.tview_homeoptions);
            arg0.setOnTouchListener(new OnTouchListener() {//arg0 is the view of selected position

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN)
                        {t.setTextColor(Color.parseColor("#ff0000"));}
                    if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() == MotionEvent.ACTION_UP))
                        {t.setText("up");}
                    return false;
                }
            });
            break;
        case 1:
            //todo
            break;
         case 2:
            //todo
            break;
        //so on

        default:
            break;
        }

надеюсь, что это работает.

Сначала используйте onTouch(View view, MotionEvent motionEvent) OnTouchListener() через setOnTouchListener() в ссылке на просмотр списка, чтобы получить события MotionEvent.ACTION_UP и MotionEvent.ACTION_DOWN (также используйте return false, иначе вы заблокируете поток событий для обычных событий просмотра списка).

Затем Вы можете включить представление в xml-макет для элемента списка и использовать свой адаптер, чтобы установить положение элемента, по которому щелкаете, что сделает скрытый макет видимым, и вызовет notifyDataSetchanged(); по ссылке на адаптер,

редактировать

Также вы можете использовать setOnItemLongPressListener() для listview, чтобы получить длинное событие нажатия, а затем захватить событие ACTION_UP.

Вы могли бы сделать следующее.

Для элемента ListView создайте FrameLayout, который включает макет элемента списка (layout1) и макет с видом, который должен отображаться при длительном нажатии (layout2), и установите его видимость пропавшим.

Не надо долго слушать слушателя и делать

layout1.setVisibility(View.GONE);
layout2.setVisibility(View.Visible);

и вернуться назад

layout1.setVisibility(View.Visible);
layout2.setVisibility(View.GONE);

Вот полный код для вас: ваш listItem.xml:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/longClickedView"
        android:text="long click"
        android:background="#99cc00"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"/>
    <TextView
    android:id="@+id/normalView"
    android:text="normal"
    android:background="#cc0011"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</FrameLayout>

и в вашей деятельности / фрагмент:

list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                view.findViewById(R.id.normal).setVisibility(View.GONE);
                view.findViewById(R.id.longClicked).setVisibility(View.VISIBLE);
                return true;
            }
        });

Вы должны сделать следующее:

установите прослушиватель longclick для элементов списка и в функции onItemLongClick измените вид

  listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

        public boolean onItemLongClick(AdapterView<?> arg0, View v,
                int index, long arg3) {
            // TODO change you view at index
            return true;
        }
  }); 
Другие вопросы по тегам