Проведите по элементу ListView справа налево, чтобы показать кнопку удаления

У меня есть собственный ListView, показывающий список слов, выбираемых из базы данных. Когда я прокручиваю этот элемент списка, я хочу показать кнопку «Удалить», как показано на рисунке ниже. И когда я нажимаю эту кнопку, она удаляется из базы данных и обновляет список. mПролистнуть элемент списка

Я уже смотрю этот пример кода здесь. Но это все еще не работает.


person user3098538    schedule 27.12.2013    source источник
comment
Возможный дубликат stackoverflow .com/questions/17520750/   -  person Triode    schedule 27.12.2013
comment
Благодарим Вас за оценку Однако на самом деле список раздувает пользовательский макет в адаптере. Конечно, если мы хотим показать/скрыть кнопку удаления, мы должны сделать это в Adpater, верно? И удивляюсь, как я могу так поступить.   -  person user3098538    schedule 27.12.2013
comment
Вы проверили ответ @luciano Rodriguez?   -  person Kailash Dabhi    schedule 27.12.2013
comment
На самом деле мне не нужна библиотека, потому что я думаю, что эту проблему не так сложно реализовать, но я не знаю, как это сделать.   -  person user3098538    schedule 27.12.2013
comment
Я думаю, что количество кода не так много, но я не знаю, с чего начать.   -  person user3098538    schedule 27.12.2013


Ответы (11)


РЕДАКТИРОВАТЬ: среди других вариантов есть хорошая библиотека, которая может решить вашу проблему: https://github.com/daimajia/AndroidSwipeLayout

person Luciano Rodríguez    schedule 27.12.2013
comment
Честно говоря, он ссылается на библиотеки на GitHub. Ты хотел, чтобы он скопировал исходный код этого проекта сюда? И поддерживать его? - person k2col; 24.04.2015
comment
Я не рекомендую Android SwipeListView. Просто посмотрите на проблемы, слишком много ошибок. - person Makalele; 03.10.2015

Раньше у меня была такая же проблема с поиском хорошей библиотеки для этого. В конце концов я создал библиотеку, которая может это сделать: SwipeRevealLayout

В файле градиента:

dependencies {
    compile 'com.chauthai.swipereveallayout:swipe-reveal-layout:1.4.0'
}

В вашем xml-файле:

<com.chauthai.swipereveallayout.SwipeRevealLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:mode="same_level"
    app:dragEdge="left">

    <!-- Your secondary layout here -->
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

    <!-- Your main layout here -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</com.chauthai.swipereveallayout.SwipeRevealLayout>

Затем в вашем файле адаптера:

public class Adapter extends RecyclerView.Adapter {
  // This object helps you save/restore the open/close state of each view
  private final ViewBinderHelper viewBinderHelper = new ViewBinderHelper();

  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    // get your data object first.
    YourDataObject dataObject = mDataSet.get(position); 

    // Save/restore the open/close state.
    // You need to provide a String id which uniquely defines the data object.
    viewBinderHelper.bind(holder.swipeRevealLayout, dataObject.getId()); 

    // do your regular binding stuff here
  }
}
person Chau Thai    schedule 17.04.2016
comment
Не удается разрешить swipeRevealLayout. Не могли бы вы мне помочь. - person Amar Ilindra; 20.06.2016
comment
@Amarilindra: сначала добавьте это ‹?xml version=1.0 encoding=utf-8?› - person Rishi; 16.07.2016
comment
Это удивительное решение! Мне нужно стабилизировать его в моей очень сложной конструкции, но я в шоке, что он работает так хорошо, как работает. У меня есть просмотрщик страниц со стилем Gmail, чтобы закрыть его. Что не работает, если вы пытаетесь вложить просмотрщиков страниц или вам нужно захватить свайпы и потерять анимацию. Это сработало с первой попытки. (хотя пропускает ~ 20% свайпов, и родитель их крадет, но мне нужно попробовать некоторые настройки) - person StarWind0; 01.09.2016
comment
@Chau Thai Совместима ли ваша библиотека с androidx? Я использовал вашу библиотеку в своем проекте Android, который мне нужно перенести на androidx. Пожалуйста, помогите мне. - person Neha; 16.07.2019

я много искал в Google и нашел наиболее подходящий проект — swipmenulistview https://github.com/baoyongzhang/SwipeMenuListView на гитхаб.

person SalutonMondo    schedule 29.12.2014
comment
Я попытался преобразовать рабочий ListView в SwipeMenuListView в своем приложении. Он продолжал падать с ошибкой проверки внутри кода библиотеки. На странице github недостаточно документации, чтобы понять, что я делаю неправильно. - person Carl Smith; 23.07.2015
comment
продолжайте пробовать, я интегрирую этот проект с библиотекой просмотра списка перетаскиванием для сортировки, все работает отлично. - person SalutonMondo; 23.07.2015
comment
Просто и здорово! На реализацию у меня ушло всего несколько минут! - person Makalele; 03.10.2015
comment
Это очень полезно - person Steve; 13.06.2016
comment
Это потрясающая библиотека, но она не поддерживает notifiyDataSetChanged() в адаптере или представлении списка. Когда я использую меню смахивания для удаления элемента списка, мне, очевидно, нужно впоследствии обновить представление списка. - person Rishi; 16.07.2016
comment
Это просто удар с одной стороны. - person Tushar Gogna; 17.03.2017

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

person Lalit Poptani    schedule 17.01.2014
comment
Не могли бы вы лицензировать свой код, чтобы мы все могли легально использовать его части? Спасибо :) - person user364622; 15.03.2014
comment
Это просто реализация дизайна IOS. что не нравится Android - person IAmGroot; 01.05.2014
comment
Также было бы неплохо, если бы у вас был файл README.md на вашей странице github с несколькими снимками экрана вашей библиотеки в действии. - person Bill Mote; 25.07.2014
comment
В родном почтовом приложении @Doomsknight для Android используется функция удаления свайпом, поэтому вряд ли можно сказать, что сторонние приложения не могут этого сделать. - person Carl Smith; 23.07.2015

Я только что получил его работу с помощью ViewSwitcher в ListItem.

list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<ViewSwitcher
    android:id="@+id/list_switcher"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:inAnimation="@android:anim/slide_in_left"
    android:outAnimation="@android:anim/slide_out_right"
    android:measureAllChildren="false" >
    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="center_vertical"
        android:maxHeight="50dp"
        android:paddingLeft="10dp" />

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:clickable="false"
        android:gravity="center"
        >

    <Button
        android:id="@+id/b_edit_in_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Edit"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"

         />
    <Button
        android:id="@+id/b_delete_in_list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delete"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:background="@android:color/holo_red_dark"
        />
    </LinearLayout>
</ViewSwitcher>

In the ListAdapter: Implement OnclickListeners for the Edit and Delete button in the getView() method. The catch here is to get the position of the ListItem clicked inside the onClick methods. setTag() and getTag() methods are used for this.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    final ViewHolder viewHolder;
    if (convertView == null) {
        viewHolder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.list_item, null);
        viewHolder.viewSwitcher=(ViewSwitcher)convertView.findViewById(R.id.list_switcher);
        viewHolder.itemName = (TextView) convertView
                .findViewById(R.id.tv_item_name);
        viewHolder.deleteitem=(Button)convertView.findViewById(R.id.b_delete_in_list);
        viewHolder.deleteItem.setTag(position);
        viewHolder.editItem=(Button)convertView.findViewById(R.id.b_edit_in_list);
        viewHolder.editItem.setTag(position);
        viewHolder.deleteItem.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                fragment.deleteItemList((Integer)v.getTag());
            }
        });

        viewHolder.editItem.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                fragment.editItemList(position);
            }
        });
        convertView.setTag(viewHolder);
} else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.itemName.setText(itemlist[position]);
return convertView;  
}

Во фрагменте добавьте прослушиватель жестов для обнаружения жеста Fling:

public class MyGestureListener extends SimpleOnGestureListener {
    private ListView list;

    public MyGestureListener(ListView list) {
        this.list = list;
    }

    // CONDITIONS ARE TYPICALLY VELOCITY OR DISTANCE

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // if (INSERT_CONDITIONS_HERE)

        ltor=(e2.getX()-e1.getX()>DELTA_X);
        if (showDeleteButton(e1))
        {
            return true;
        }
        return super.onFling(e1, e2, velocityX, velocityY);
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY) {
        // TODO Auto-generated method stub
        return super.onScroll(e1, e2, distanceX, distanceY);
    }

    private boolean showDeleteButton(MotionEvent e1) {
        int pos = list.pointToPosition((int) e1.getX(), (int) e1.getY());
        return showDeleteButton(pos);
    }

    private boolean showDeleteButton(int pos) {

        View child = list.getChildAt(pos);
        if (child != null) {
            Button delete = (Button) child
                    .findViewById(R.id.b_edit_in_list);
            ViewSwitcher viewSwitcher = (ViewSwitcher) child
                    .findViewById(R.id.host_list_switcher);
            TextView hostName = (TextView) child
                    .findViewById(R.id.tv_host_name);
            if (delete != null) {
                    viewSwitcher.setInAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_left));
                    viewSwitcher.setOutAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.slide_out_right));
                }

                viewSwitcher.showNext();
                // frameLayout.setVisibility(View.VISIBLE);
            }
            return true;
        }
        return false;
    }
}

В методе onCreateView фрагмента

GestureDetector gestureDetector = new GestureDetector(getActivity(),
            new MyGestureListener(hostList));
    hostList.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (gestureDetector.onTouchEvent(event)) {
                return true;
            } else {
                return false;
            }

        }
    });

Это сработало для меня. Следует уточнить его больше.

person user3316561    schedule 18.06.2015
comment
Если я проведу 3-й раз, нет просмотра, то 4-й не проведет. Другой вопрос, как я могу открыть только один вид? - person IntelliJ Amiya; 06.04.2016
comment
Я просто обработал это вручную. Сохраните последний просмотр (prevItem). Когда пользователь пытается провести пальцем по другому представлению (currItem), вызовите viewSwitcher.showNext() или viewSwitcher.showPrevious() для prevItem в дополнение к тому же вызову для currItem. Таким образом, за один раз будет прокручиваться только один вид. - person user3316561; 06.04.2016
comment
Имея ListView, где мне нужно прокручивать, идентификация представления для изменения не удается для некоторых детей. Однако замена list.getChildAt(pos) на list.getChildAt(pos-list.getFirstVisiblePosition()) работает нормально. - person Daniel Heldt; 21.03.2017

см. там ссылка была очень красивой и простой. он работает нормально... вы не хотите, чтобы какая-либо библиотека работала нормально. нажмите здесь

OnTouchListener gestureListener = new View.OnTouchListener() {
    private int padding = 0;
    private int initialx = 0;
    private int currentx = 0;
    private  ViewHolder viewHolder;

    public boolean onTouch(View v, MotionEvent event) {
        if ( event.getAction() == MotionEvent.ACTION_DOWN) {
            padding = 0;
            initialx = (int) event.getX();
            currentx = (int) event.getX();
            viewHolder = ((ViewHolder) v.getTag());
        }
        if ( event.getAction() == MotionEvent.ACTION_MOVE) {
            currentx = (int) event.getX();
            padding = currentx - initialx;
        }       
        if ( event.getAction() == MotionEvent.ACTION_UP || 
                     event.getAction() == MotionEvent.ACTION_CANCEL) {
            padding = 0;
            initialx = 0;
            currentx = 0;
        }
        if(viewHolder != null) {
            if(padding == 0) {
                v.setBackgroundColor(0xFF000000 );  
                if(viewHolder.running)
                    v.setBackgroundColor(0xFF058805);
            }
            if(padding > 75) {
                viewHolder.running = true;
                v.setBackgroundColor(0xFF00FF00 );  
                viewHolder.icon.setImageResource(R.drawable.clock_running);
            }
            if(padding < -75) {
                viewHolder.running = false;
                v.setBackgroundColor(0xFFFF0000 );  
            }

            v.setPadding(padding, 0,0, 0);
        }

        return true;
    }
};
person Arul Pandian    schedule 17.01.2014
comment
это для того, чтобы поместить t в класс держателя представления для строки списка? - person Raju yourPepe; 18.05.2014
comment
Да, вы просто посетите справочную ссылку. Это объяснит вам. - person Arul Pandian; 18.05.2014

Доступно приложение, которое демонстрирует список, который сочетает в себе как удаление смахиванием, так и перетаскивание для изменения порядка элементов. Код основан на коде Чета Хааза для удаления с помощью смахивания и коде Даниэля Ольшанского для изменения порядка перетаскивания.

Код Чета сразу удаляет предмет. Я улучшил это, сделав его более похожим на Gmail, где пролистывание показывает вид снизу, который указывает, что элемент удален, но предоставляет кнопку «Отменить», где у пользователя есть возможность отменить удаление. В коде Чета тоже есть ошибка. Если у вас меньше элементов в списке, чем высота списка, и вы удаляете последний элемент, последний элемент не удаляется. Это было исправлено в моем коде.

Код Даниэля требует длительного нажатия на предмет. Многие пользователи считают это неинтуитивным, поскольку это, как правило, скрытая функция. Вместо этого я изменил код, добавив кнопку «Переместить». Вы просто нажимаете на кнопку и перетаскиваете элемент. Это больше соответствует тому, как работает приложение Google News, когда вы меняете порядок новостных тем.

Исходный код вместе с демонстрационным приложением доступен по адресу: https://github.com/JohannBlake/ListViewOrderAndSwipe.

Чет и Даниэль оба из Google.

Видео Чета об удалении элементов можно посмотреть по адресу: https://www.youtube.com/watch?v=YCHNAi9kJI4

Видео Даниэля о повторном заказе товаров можно посмотреть по адресу: https://www.youtube.com/watch?v=_BZIvjMgH-Q

Значительный объем работы был потрачен на то, чтобы склеить все это вместе, чтобы обеспечить безупречный пользовательский интерфейс, поэтому я был бы признателен за лайк или голосование. Пожалуйста, также пометьте проект на Github.

person AndroidDev    schedule 10.07.2015
comment
удалил репозиторий? - person AppDeveloper; 27.10.2019

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

Примечание. Я использую представление recycler и ViewHolder. Некоторые значения жестко закодированы, поэтому измените их в соответствии с вашими требованиями.

  • row_layout.xml

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:orientation="horizontal">
        <Button
            android:id="@+id/slide_button_2"
            android:text="Button2"
            android:layout_width="80dp"
            android:layout_height="80dp" />
        <Button
            android:id="@+id/slide_button_1"
            android:text="Button1"
            android:layout_width="80dp"
            android:layout_height="80dp" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/chat_row_cell"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:orientation="horizontal"
        android:background="@color/white">
        <ImageView
            android:id="@+id/chat_image"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="10dp"
            android:layout_gravity="center"/>
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <TextView
                    android:id="@+id/chat_title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="@color/md_grey_800"
                    android:textSize="18sp"/>
                <TextView
                    android:id="@+id/chat_subtitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textColor="@color/md_grey_600"/>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    

  • ChatAdaptor.java

    открытый класс ChatAdaptor расширяет RecyclerView.Adapter {

    List<MXGroupChatSession> sessions;
    Context context;
    ChatAdaptorInterface listener;
    
    public interface ChatAdaptorInterface{
        void cellClicked(MXGroupChatSession session);
        void utilityButton1Clicked(MXGroupChatSession session);
        void utilityButton2Clicked(MXGroupChatSession session);
    }
    
    public ChatAdaptor(List<MXGroupChatSession> sessions, ChatAdaptorInterface listener, Context context){
        this.sessions=sessions;
        this.context=context;
        this.listener=listener;
    }
    
    @Override
    public ChatViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=(View)LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_row,null);
        ChatViewHolder chatViewHolder=new ChatViewHolder(view);
        return chatViewHolder;
    }
    
    @Override
    public void onBindViewHolder(ChatViewHolder holder, final int position) {
        MXGroupChatSession session=this.sessions.get(position);
        holder.selectedSession=session;
        holder.titleView.setText(session.getTopic());
        holder.subtitleView.setText(session.getLastFeedContent());
        Picasso.with(context).load(new File(session.getCoverImagePath())).transform(new CircleTransformPicasso()).into(holder.imageView);
    }
    
    @Override
    public int getItemCount() {
        return sessions.size();
    }
    
    public class ChatViewHolder extends RecyclerView.ViewHolder{
        ImageView imageView;
        TextView titleView;
        TextView subtitleView;
        ViewGroup cell;
        ViewGroup cellContainer;
        Button button1;
        Button button2;
    
        MXGroupChatSession selectedSession;
        private GestureDetectorCompat gestureDetector;
    
        float totalx;
        float buttonTotalWidth;
    
        Boolean open=false;
        Boolean isScrolling=false;
    
    
        public ChatViewHolder(View itemView) {
            super(itemView);
            cell=(ViewGroup) itemView.findViewById(R.id.chat_row_cell);
            cellContainer=(ViewGroup) itemView.findViewById(R.id.chat_row_container);
            button1=(Button) itemView.findViewById(R.id.slide_button_1);
            button2=(Button) itemView.findViewById(R.id.slide_button_2);
    
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.utilityButton1Clicked(selectedSession);
                }
            });
    
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.utilityButton2Clicked(selectedSession);
                }
            });
    
            ViewTreeObserver vto = cellContainer.getViewTreeObserver();
            vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    buttonTotalWidth = button1.getWidth()+button2.getWidth();
                }
            });
    
            this.titleView=(TextView)itemView.findViewById(R.id.chat_title);
            subtitleView=(TextView)itemView.findViewById(R.id.chat_subtitle);
            imageView=(ImageView)itemView.findViewById(R.id.chat_image);
            gestureDetector=new GestureDetectorCompat(context,new ChatRowGesture());
    
            cell.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(gestureDetector.onTouchEvent(event)){
                        return true;
                    }
    
                    if(event.getAction() == MotionEvent.ACTION_UP) {
                        if(isScrolling ) {
                            isScrolling  = false;
                            handleScrollFinished();
                        };
                    }
                    else if(event.getAction() == MotionEvent.ACTION_CANCEL){
                        if(isScrolling ) {
                            isScrolling  = false;
                            handleScrollFinished();
                        };
                    }
                    return false;
                }
            });
        }
    
    
        public class ChatRowGesture extends GestureDetector.SimpleOnGestureListener {
    
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                if (!open){
                    listener.cellClicked(selectedSession);
                }
                return true;
            }
    
            @Override
            public boolean onDown(MotionEvent e) {
                return true;
            }
    
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                    isScrolling=true;
                    totalx=totalx+distanceX;
                    freescroll(totalx);
    
                return true;
            }
        }
    
        void handleScrollFinished(){
            if (open){
                if (totalx>2*buttonTotalWidth/3){
                    slideLeft();
                    totalx=buttonTotalWidth;
                }else{
                    slideRight();
                    totalx=0;
                }
            }else{
                if (totalx>buttonTotalWidth/3){
                    slideLeft();
                    totalx=buttonTotalWidth;
                }else{
                    slideRight();
                    totalx=0;
                }
            }
    
        }
    
        void slideRight(){
            TransitionManager.beginDelayedTransition(cellContainer);
            ViewGroup.MarginLayoutParams params;
            params=(ViewGroup.MarginLayoutParams) cell.getLayoutParams();
            params.setMargins(0,0,0,0);
            cell.setLayoutParams(params);
            open=false;
        }
    
        void slideLeft(){
            TransitionManager.beginDelayedTransition(cellContainer);
            ViewGroup.MarginLayoutParams params;
            params=(ViewGroup.MarginLayoutParams) cell.getLayoutParams();
            params.setMargins(((int)buttonTotalWidth*-1),0,(int)buttonTotalWidth,0);
            cell.setLayoutParams(params);
            open=true;
        }
        void freescroll(float x){
            if (x<buttonTotalWidth && x>0){
                int xint=(int)x;
                ViewGroup.MarginLayoutParams params;
                params=(ViewGroup.MarginLayoutParams) cell.getLayoutParams();
                params.setMargins(params.leftMargin,0,xint,0);
                cell.setLayoutParams(params);
            }
        }
    }
    

Надеюсь, это поможет кому-то!!

person Gitesh Agarwal    schedule 02.02.2017
comment
Спасибо за это. Мне пришлось кое-что изменить, но это работало намного лучше и быстрее, чем использование большой библиотеки. В итоге я использовал относительные макеты вместо линейных макетов для всего. Я также изменил кнопку на RelativeLayout с текстовым представлением внутри, чтобы я мог заставить состояния нажатия работать с кнопкой и основным разделом. А затем в прослушивателе жестов и прослушивателе касаний я устанавливаю цвет фона основного раздела для обратной связи касания. - person shane; 28.02.2017

Определите ViewPager в макете .xml:

<android.support.v4.view.ViewPager
    android:id="@+id/example_pager"
    android:layout_width="fill_parent"
    android:layout_height="@dimen/abc_action_bar_default_height" />

А затем в своей активности/фрагменте установите собственный адаптер пейджера:

В деятельности:

protected void onCreate(Bundle savedInstanceState) {
    PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
    ViewPager pager = (ViewPager) findViewById(R.id.example_pager);

    pager.setAdapter(adapter);
    // pager.setOnPageChangeListener(this); // You can set a page listener here
    pager.setCurrentItem(0);
}

Во фрагменте:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_layout, container, false);

    if (view != null) {
        PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
        ViewPager pager = (ViewPager) view.findViewById(R.id.example_pager);

        pager.setAdapter(adapter);
        // pager.setOnPageChangeListener(this); // You can set a page listener here
        pager.setCurrentItem(0);
    }

    return view;
}

Создайте наш пользовательский класс пейджера:

// setup your PagerAdapter which extends FragmentPagerAdapter
class PagerAdapter extends FragmentPagerAdapter {
    public static final int NUM_PAGES = 2;
    private CustomFragment[] mFragments = new CustomFragment[NUM_PAGES];
    public PagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }
    @ Override
    public int getCount() {
        return NUM_PAGES;
    }
    @ Override
    public Fragment getItem(int position) {
        if (mFragments[position] == null) {
               // this calls the newInstance from when you setup the ListFragment
            mFragments[position] = new CustomFragment();
        }
        return mFragments[position];
    }
}
person Omer Leshem    schedule 26.05.2014
comment
Вы поняли вопрос? - person Diego Palomar; 10.09.2014
comment
@DiegoPalomar Этот код даст вам полное смахивание. Изменится весь макет, а не только часть. Мне нравится идея. Это как-то помогает - person Saif Hamed; 20.09.2014

Реализовать с нуля эту функциональность — пустая трата времени. Я реализовал библиотеку, рекомендованную SalutonMondo, и очень доволен. Это очень просто в использовании и очень быстро. Я улучшил исходную библиотеку и добавил новый прослушиватель кликов для кликов по элементам. Также я добавил классную библиотеку шрифтов (http://fortawesome.github.io/Font-Awesome/) и теперь вы можете просто добавить новый заголовок элемента и указать имя значка из шрифта awesome.

Вот ссылка на github

person Popa Andrei    schedule 23.01.2015
comment
Демонстрация библиотеки на странице github прекрасна. Когда я пытался преобразовать его из работающего ListView, он продолжал падать. На странице github было недостаточно документации, чтобы понять, что я делаю неправильно. - person Carl Smith; 23.07.2015

вы можете использовать этот код

holder.img_close.setOnClickListener(new View.OnClickListener() {
      @Override
        public void onClick(View view) {
            holder.swipeRevealLayout.close(true);
            list.remove(position);
            notifyDataSetChanged();
      }});
person Mohammad Nori    schedule 22.09.2019