这是一个实现listView左右滑动实现删除的框架,仿照QQ聊天实现左滑(右滑)出现删除等按钮。
1、首先从github上下载SwipeMenuListView框架,依赖里面的library;
2、代码的实现:
public class MainActivity extends AppCompatActivity { private SwipeMenuListView spmListView; private List<String> list; private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { list = new ArrayList<>(); for(int i = 0;i<20;i++){ list.add("这 是 第"+ i +"条 数 据"); } spmListView = (SwipeMenuListView) findViewById(R.id.listView); adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list); spmListView.setAdapter(adapter); creatAddItem(); ClickItem(); } /** * 增加open和delect按钮 */ private void creatAddItem(){ SwipeMenuCreator creator = new SwipeMenuCreator() { @Override public void create(SwipeMenu menu) { SwipeMenuItem openItem = new SwipeMenuItem(getApplicationContext()); openItem.setBackground(new ColorDrawable(Color.rgb(0xc9,0xc9,0xce))); openItem.setWidth(dp2px(90)); openItem.setTitle("open"); openItem.setTitleSize(18); openItem.setTitleColor(Color.WHITE); menu.addMenuItem(openItem); SwipeMenuItem delectitem = new SwipeMenuItem(getApplicationContext()); delectitem.setBackground(new ColorDrawable(Color.rgb(0xf9,0x3f,0x25))); delectitem.setWidth(dp2px(90)); delectitem.setIcon(R.drawable.ic_delete); menu.addMenuItem(delectitem); } }; spmListView.setMenuCreator(creator); } private void ClickItem(){ spmListView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(int position, SwipeMenu menu, int index) { switch (index){ case 0: Toast.makeText(MainActivity.this,"点击打开按钮",Toast.LENGTH_LONG).show(); break; case 1: list.remove(position); adapter.notifyDataSetChanged(); break; } return false; } }); //左右滑动监听事件 spmListView.setOnSwipeListener(new SwipeMenuListView.OnSwipeListener() { @Override public void onSwipeStart(int position) { // swipe start Log.d("print", "onSwipeStart: "+"--------------"); } @Override public void onSwipeEnd(int position) { // swipe end Log.d("print", "onSwipeStart: "+"++++++++++++++++++++"); } }); //item左右滑动的打开和关闭 spmListView.setOnMenuStateChangeListener(new SwipeMenuListView.OnMenuStateChangeListener() { @Override public void onMenuOpen(int position) { Log.d("print", "onSwipeStart: "+"<<<<<<<<<<<<"); } @Override public void onMenuClose(int position) { Log.d("print", "onSwipeStart: "+">>>>>>>>>>>>>>>>"); } }); } /** * * 将dp转换为dip * @param dp * @return */ private int dp2px(int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } /** * 顶部菜单栏的点击事件(改变open和delect的位置) * @param item * @return */ @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_left) { spmListView.setSwipeDirection(SwipeMenuListView.DIRECTION_LEFT); return true; } if (id == R.id.action_right) { spmListView.setSwipeDirection(SwipeMenuListView.DIRECTION_RIGHT); return true; } return super.onOptionsItemSelected(item); } }3、其中dp2px是dp转换为dip的一个方法,关于Android中各单位之间的转换,可参考方法:
public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: return value; case COMPLEX_UNIT_DIP: return value * metrics.density; case COMPLEX_UNIT_SP: return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; }关于其实现原理这里不多加介绍,有兴趣的可自行研究
4、Xml文件:
mainActivity的xml:
<LinearLayout 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" android:orientation="vertical" tools:context="com.example.wls.swipmenulistview.MainActivity"> <com.baoyz.swipemenulistview.SwipeMenuListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>5、顶部菜单的实现:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/action_left" android:orderInCategory="100" android:title="Left" app:showAsAction="never" /> <item android:id="@+id/action_right" android:orderInCategory="100" android:title="Right" app:showAsAction="never" /> </menu>
6、效果图: