Swipe ListView item From right to left show delete button

后端 未结 11 819
轻奢々
轻奢々 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:40

    I just got his working using the ViewSwitcher in a ListItem.

    list_item.xml:

    
    
    
    
        
    
        
    
        

    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.

提交回复
热议问题