Swipe ListView item From right to left show delete button

后端 未结 11 755
轻奢々
轻奢々 2020-12-07 09:15

I have a custom ListView showing the list of words selecting from database. When I swipe this listview item i want to show Delete button like image below. And when I press t

相关标签:
11条回答
  • 2020-12-07 09:35

    you can use this code

    holder.img_close.setOnClickListener(new View.OnClickListener() {
          @Override
            public void onClick(View view) {
                holder.swipeRevealLayout.close(true);
                list.remove(position);
                notifyDataSetChanged();
          }});
    
    0 讨论(0)
  • 2020-12-07 09:38

    I used to have the same problem finding a good library to do that. Eventually, I created a library which can do that: SwipeRevealLayout

    In gradle file:

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

    In your xml file:

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

    Then in your adapter file:

    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
      }
    }
    
    0 讨论(0)
  • 2020-12-07 09:38

    i've searched google a lot and find the best suited project is the swipmenulistview https://github.com/baoyongzhang/SwipeMenuListView on github.

    0 讨论(0)
  • 2020-12-07 09:40

    I just got his working using the ViewSwitcher in a 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;  
    }
    

    In the Fragment, Add a Gesture Listener to detect the Fling Gesture:

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

    In the onCreateView method of the Fragment,

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

    This worked for me. Should refine it more.

    0 讨论(0)
  • 2020-12-07 09:42

    Define a ViewPager in your layout .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" />
    

    And then, in your activity / fragment, set a custom pager adapter:

    In an activity:

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

    In a fragment:

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

    Create our custom pager class:

    // 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];
        }
    }
    
    0 讨论(0)
提交回复
热议问题