package com.example111.sxy.a08;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ListView lv_main;
private ArrayList<MyBeans> myBeans;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main = (ListView) findViewById(R.id.lv_main);
myBeans = new ArrayList<>();
for (int i = 0;i<100;i++){
myBeans.add(new MyBeans("content"+i));
}
myAdapter = new MyAdapter();
lv_main.setAdapter(myAdapter);
}
static class ViewHolder{
TextView item_context;
TextView item_menu;
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return myBeans.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null) {
convertView = View.inflate(MainActivity.this,R.layout.item_main,null);
viewHolder = new ViewHolder();
viewHolder.item_context = (TextView) convertView.findViewById(R.id.item_context);
viewHolder.item_menu = (TextView) convertView.findViewById(R.id.item_menu);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder) convertView.getTag();
}
final MyBeans myBean = myBeans.get(position);
viewHolder.item_context.setText(myBean.getName());
viewHolder.item_context.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyBeans m = myBeans.get(position);
Toast.makeText(MainActivity.this,m.getName(),Toast.LENGTH_LONG).show();
}
});
viewHolder.item_menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SlideLayout slidelayout = (SlideLayout) v.getParent();
slidelayout.closeMenu();
myBeans.remove(myBean);
notifyDataSetChanged();
}
});
SlideLayout slideLayout = (SlideLayout) convertView;
slideLayout.setOnStateChangeListenter(new MyOnStateChangeListenter());
return convertView;
}
}
private SlideLayout slideLayout;
class MyOnStateChangeListenter implements SlideLayout.OnStateChangeListenter{
@Override
public void onClose(SlideLayout layout) {
if(slideLayout == layout) {
slideLayout = null;
}
}
@Override
public void onDown(SlideLayout layout) {
if(slideLayout != null && slideLayout != layout) {
slideLayout.closeMenu();
}
}
@Override
public void onOpen(SlideLayout layout) {
slideLayout = layout;
}
}
}
package com.example111.sxy.a08;
/**
* Created by sxy on 2017/10/26.
*/
public class MyBeans {
private String name;
@Override
public String toString() {
return "MyBeans{" +
"name='" + name + '\'' +
'}';
}
public MyBeans(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.example111.sxy.a08;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.Scroller;
/**
* Created by sxy on 2017/10/26.
*/
public class SlideLayout extends FrameLayout {
private int contextWidth;
private int menuWidth;
private int contextheight;
private View contextView;
private View menuView;
private Scroller scroller;
public SlideLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
scroller = new Scroller(context);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
contextView = getChildAt(0);
menuView = getChildAt(1);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
contextWidth = contextView.getMeasuredWidth();
menuWidth = menuView.getMeasuredWidth();
contextheight = getMeasuredHeight();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
menuView.layout(contextWidth,0,contextWidth+menuWidth,contextheight);
}
private float startx;
private float starty;
private float downX;
private float downY;
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downX= startx = event.getX();
downY=starty=event.getY();
break;
case MotionEvent.ACTION_MOVE:
float endy = event.getY();
float endx = event.getX();
float distenceX = endx-startx;
int sroX = (int) (getScrollX()-distenceX);
if(sroX<0) {
sroX=0;
}else if(sroX>menuWidth) {
sroX = menuWidth;
}
scrollTo(sroX,getScrollY());
float dx = Math.abs(endx-downX);
float dy = Math.abs(endy-downY);
if(dx>dy && dx>5) {
getParent().requestDisallowInterceptTouchEvent(true);
}
startx = event.getX();
starty=event.getY();
break;
case MotionEvent.ACTION_UP:
int sx = getScrollX();
if(sx>menuWidth/2) {
openMenu();
}else {
closeMenu();
}
break;
}
return true;
}
public void closeMenu() {
int dx = 0-getScrollX();
scroller.startScroll(getScrollX(),getScrollY(),dx,getScrollY());
invalidate();
if(onStateChangeListenter != null) {
onStateChangeListenter.onClose(this);
}
}
public void openMenu() {
int dx = menuWidth-getScrollX();
scroller.startScroll(getScrollX(),getScrollY(),dx,getScrollY());
invalidate();
if(onStateChangeListenter != null) {
onStateChangeListenter.onOpen(this);
}
}
@Override
public void computeScroll() {
super.computeScroll();
if(scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(),scroller.getCurrY());
invalidate();
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean a = false;
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downX= startx = event.getX();
downY=starty=event.getY();
if(onStateChangeListenter != null) {
onStateChangeListenter.onDown(this);
}
break;
case MotionEvent.ACTION_MOVE:
float endy = event.getY();
float endx = event.getX();
float distenceX = endx-startx;
float dx = Math.abs(endx-downX);
float dy = Math.abs(endy-downY);
if(dx>8) {
a = true;
}
break;
case MotionEvent.ACTION_UP:
break;
}
return a;
}
public interface OnStateChangeListenter{
void onClose(SlideLayout layout);
void onDown(SlideLayout layout);
void onOpen(SlideLayout layout);
}
private OnStateChangeListenter onStateChangeListenter;
public void setOnStateChangeListenter(OnStateChangeListenter onStateChangeListenter) {
this.onStateChangeListenter = onStateChangeListenter;
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example111.sxy.a08.MainActivity">
<ListView
android:id="@+id/lv_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="60dp"
android:background="#44000000"
android:textColor="#000000"
android:text="context"
android:textSize="25sp"
android:gravity="center">
</TextView>
<?xml version="1.0" encoding="utf-8"?>
<com.example111.sxy.a08.SlideLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="60dp">
<include android:id="@+id/item_context" layout="@layout/item_context"/>
<include android:id="@+id/item_menu" layout="@layout/item_menu"/>
</com.example111.sxy.a08.SlideLayout>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="60dp"
android:background="#22000000"
android:textColor="#ff0000"
android:text="Delete"
android:textSize="25sp"
android:gravity="center">
</TextView>