滑动ListView项目从右到左显示删除按钮


72

我有一个自定义ListView,显示从数据库中选择的单词列表。当我滑动此listview项目时,我想显示“删除”按钮,如下图所示。当我按下该按钮时,它将被从数据库中删除并刷新列表视图。米滑动Listview项目

我已经在这里查看此示例代码。但这仍然行不通。



感谢Rajesh CP。但是,实际上listview会在适配器中膨胀自定义布局。当然,如果要显示/隐藏“删除”按钮,必须在Adpater中执行,对吗?想知道我该怎么做。
user3098538 2013年

您检查了@luciano rodriguez的答案吗?
Kailash Dabhi 2013年

实际上,我不需要库,因为我认为这个问题并不难实现,但我不知道该怎么做。
user3098538 2013年

我认为代码数量不多,但我不知道从哪一点开始。
user3098538 2013年

Answers:



18

我曾经遇到过一个同样的问题,那就是找到一个好的库来做到这一点。最终,我创建了一个可以做到这一点的库:SwipeRevealLayout

在gradle文件中:

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
  }
}

无法解决“ swipeRevealLayout”。你能帮我么。
Amar Ilindra

@Amarilindra:添加此第一个<?xml版本=“ 1.0” encoding =“ utf-8”?>
Rishi

这是一个了不起的解决方案!我需要在非常复杂的设计中使其稳定下来,但令我震惊的是它的工作原理还不错。我有一个使用gmail样式滑动的综合浏览器来关闭。如果您尝试嵌套网页浏览器,或者必须捕获滑动并丢失动画,该方法将不起作用。这工作第一次尝试。(尽管错过了约20%的刷卡,而父母却偷了它们,但是我有一些调整可以尝试)
StarWind0 '16

@Chau Thai您的库兼容androidx吗?我一直在我的android项目中使用您的库,我需要将该库迁移到androidx。请帮助我
Neha

15

我已经在Google上进行了大量搜索,发现最合适的项目是github上的swipmenulistview https://github.com/baoyongzhang/SwipeMenuListView


我尝试在我的应用程序中将工作的ListView转换为SwipeMenuListView。它在库代码内始终因验证错误而崩溃。github页面上没有足够的文档供我了解我在做什么错。
卡尔·史密斯

1
继续尝试,我将这个项目与对列表视图库的拖动进行集成,效果很好。
SalutonMondo 2015年

简单而伟大!花了我几分钟时间实施!
Makalele,2015年

1
这对我们很有帮助
Steve

这是一个很棒的库,但是它不支持适配器或列表视图上的notifiyDataSetChanged()。当我使用滑动菜单删除列表项时,显然我需要随后更新列表视图。
Rishi

10

我已经在github上创建了一个演示,其中包括从右向左滑动的删除按钮,您将可以从ListView中删除项目并更新ListView。


6
您能否请许可您的代码,以便我们所有人都可以合法使用它的一部分?谢谢:)
user364622

8
这只是实现IOS设计。哪个android不喜欢
IAmGroot

2
如果您在github页面上有一个README.md文件,并且正在使用一些库的屏幕截图,那也将是很好的。
比尔·莫特2014年

1
@Doomsknight Android的本机电子邮件应用程序使用“刷卡删除”功能,因此他们很难说第三方应用程序不能使用。
卡尔·史密斯

5

我只是在ListItem中使用ViewSwitcher使他工作。

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>

在ListAdapter中:为getView()方法中的“编辑”和“删除”按钮实现OnclickListeners。这里的要点是获取在onClick方法内单击的ListItem的位置。setTag()和getTag()方法用于此目的。

@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;  
}

在片段中,添加手势侦听器以检测浮动手势:

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;
            }

        }
    });

这对我有用。应该进一步完善它。


如果我在第3次无视时滑动,则在第4次无视滑动。另一个问题,我怎么只能打开一个视图?
IntelliJ Amiya

1
我只是手动处理。保存最后刷过的视图(prevItem)。当用户尝试滑动另一个视图(currItem)时,除了为currItem调用该视图之外,还为prevItem调用viewSwitcher.showNext()或viewSwitcher.showPrevious()。这样,一次只可以滑动一个视图。
3316561

我有一个必须滚动的ListView,因此对某些孩子而言,要更改的View的标识失败。不过,将list.getChildAt(pos)替换为list.getChildAt(pos-list.getFirstVisiblePosition())效果很好。
丹尼尔·赫尔德

3

看到那里的链接非常简单。工作正常...您不希望任何图书馆工作正常。点击这里

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;
    }
};

这是为了将视图持有人类用于listview itme行?
Raju yourPepe 2014年

是的,您只需访问参考链接。它会向您解释。
2014年

2

可用的应用程序演示了一个列表视图,该列表视图结合了滑动删除和拖动以重新排序项目。该代码基于Chet Haase的“刷卡删除”代码和Daniel Olshansky的“拖动到重新排序”代码。

切特的代码会立即删除一个项目。我对此进行了改进,使其功能更像Gmail,其中滑动显示底部视图,该底部视图指示该项目已删除,但提供了“撤消”按钮,用户可以在其中撤消该删除操作。Chet的代码中也有一个bug。如果列表视图中的项目少于列表视图的高度,并且您删除了最后一项,则最后一项似乎没有被删除。这在我的代码中已修复。

Daniel的代码要求长按一个项目。许多用户发现此功能不直观,因为它倾向于隐藏功能。相反,我修改了代码以允许使用“移动”按钮。您只需按一下按钮并拖动该项目。重新排列新闻主题时,这与Google新闻应用程序的工作方式更加一致。

源代码和演示应用程序可在以下位置获得:https : //github.com/JohannBlake/ListViewOrderAndSwipe

Chet和Daniel都来自Google。

切特提供的有关删除项目的视频可以在以下网址查看:https : //www.youtube.com/watch?v=YCHNAi9kJI4

丹尼尔有关重新订购商品的视频可以在以下网址查看:https//www.youtube.com/watch?v = _BZIvjMgH-Q

为了将所有这些粘合在一起,以提供看起来似乎不太明显的UI体验,需要进行大量的工作,因此,我将不胜感激。还请在Github中为该项目加注星标。


删除了回购?
AppDeveloper

2

我已经浏览了大量的第三方库来尝试实现这一目标。但是它们都没有我想要的平滑度和可用性体验。然后我决定自己写。结果是,很好,我喜欢它。我将在这里分享代码。也许我会把它写成一个库,将来可以嵌入到任何回收者视图中。但是现在这里是代码。

注意:我有使用回收站视图和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);
            }
        }
    }
    

希望这对某人有帮助!!


2
谢谢你 我不得不更改一些东西,但是比使用大型图书馆要好得多,而且速度更快。我最终对所有东西都使用相对布局而不是线性布局。我还将按钮更改为内部带有textview的RelativeLayout,以便可以按状态操作按钮和主体部分。然后在手势侦听器和轻按侦听器上,我设置主要部分的背景颜色以用于轻按反馈。
shane

1

在布局.xml中定义一个ViewPager:

<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];
    }
}

10
你明白这个问题了吗?
Diego Palomar

@DiegoPalomar此代码将使您完全轻扫。整个布局将发生变化,而不仅仅是一部分。我喜欢这个主意。它以某种方式有所帮助
Saif Hamed 2014年

1

从头开始实现此功能很浪费时间。我实现了SalutonMondo推荐的库,对此我感到非常满意。它非常易于使用和快速。我改进了原始库,并为项目点击添加了新的点击监听器。我还添加了字体真棒库(http://fortawesome.github.io/Font-Awesome/),现在您可以简单地添加一个新项目标题并从真棒字体中指定图标名称。

是github链接


github页面上的库演示非常漂亮。当我尝试从工作的ListView转换为它时,它一直崩溃。github页面上没有足够的文档供我了解我在做什么错。
卡尔·史密斯

0

您可以使用此代码

holder.img_close.setOnClickListener(new View.OnClickListener() {
      @Override
        public void onClick(View view) {
            holder.swipeRevealLayout.close(true);
            list.remove(position);
            notifyDataSetChanged();
      }});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.