项目中增加需求:
根据不同来源的数据,修改展示页面及响应。
对于之前的数据来源,定为“来源一”
新的特殊数据来源,定为“来源二”
一、对SwipeMenuListView的研究及修改
通过之前转的关于SwipeMenuListView源码的解析 及自己对源码的阅读,发现数据展示页面右滑出现的menu的样式的修改可以通过adapter的viewtype来处理。
而,取消删除按钮的响应,可以简单的为SwipeMenu类增加一个boolean类型的变量isDisabled。如果是来源二的数据,就调用set方法将该变量设置为true。这样,在MenuItem的监听中增加判断即可。而set方法的调用,我选择再MenuItem的creator中来做。
代码:
1、adapter中增加viewtype
public static final int viewtype_normaldata = 0,viewtype_erpdata = 1;
@Override public int getViewTypeCount() { // menu type count return 2; } @Override public int getItemViewType(int position) { // current menu type return myList.get(position).containsKey("is_erp")?viewtype_erpdata:viewtype_normaldata; }
注意:viewtype的值必须在0~getViewTypeCount()-1 之间。
2、新的creator
SwipeMenuCreator creator = new SwipeMenuCreator() { @Override public void create(SwipeMenu menu) { switch (menu.getViewType()){ case SwipeMenuListViewAdapter.viewtype_normaldata: // create "delete" item SwipeMenuItem deleteItem = new SwipeMenuItem( getApplicationContext()); // set item background deleteItem.setBackground(new ColorDrawable(Color.rgb(0xFF, 0x63, 0x63))); // set item width deleteItem.setWidth(dp2px(90)); // set a icon deleteItem.setTitle("删除"); deleteItem.setTitleSize(18); deleteItem.setTitleColor(Color.parseColor("#FFFFFF")); // deleteItem.setIcon(R.drawable.ic_delete); // add to menu menu.addMenuItem(deleteItem); break; case SwipeMenuListViewAdapter.viewtype_erpdata: // create "delete" item SwipeMenuItem deleteItem_erp = new SwipeMenuItem( getApplicationContext()); // set item background deleteItem_erp.setBackground(new ColorDrawable(Color.rgb(0xDD, 0xDD, 0xDD))); // set item width deleteItem_erp.setWidth(dp2px(90)); // set a icon deleteItem_erp.setTitle("删除"); deleteItem_erp.setTitleSize(18); deleteItem_erp.setTitleColor(Color.parseColor("#FFFFFF")); // deleteItem.setIcon(R.drawable.ic_delete); // add to menu menu.addMenuItem(deleteItem_erp); menu.setIsDisabled(true); break; } } };
3、Item的监听是在SwipeMenuListView的setAdapter中添加的
@Override public void setAdapter(ListAdapter adapter) { super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) { @Override public void createMenu(SwipeMenu menu) { if (mMenuCreator != null) { mMenuCreator.create(menu);//创建好这个SwipeMenu } } @Override public void onItemClick(SwipeMenuView view, SwipeMenu menu, int index) { if ((mOnMenuItemClickListener != null)&&(!menu.getIsDisabled())) { mOnMenuItemClickListener.onMenuItemClick( view.getPosition(), menu, index); } if (mTouchView != null) { mTouchView.smoothCloseMenu(); } } }); }
如果要根据不同的MenuItem做不同的响应,就在真正的
mOnMenuItemClickListener
中根据
menu.getViewType()
在switch中分别处理一下就可以了。
mListView.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public void onMenuItemClick(int position, SwipeMenu menu, int index) { switch (menu.getViewType()){ case SwipeMenuListViewAdapter.viewtype_normaldata: break; case SwipeMenuListViewAdapter.viewtype_erpdata: Intent intent = new Intent(mContext, DialogDelStudentActivity.class); String idJSON = mAdapter.getList().get(position).get("id") .toString(); intent.putExtra("idJSON", idJSON); intent.putExtra("type", "delStudent"); startActivityForResult(intent, 1); break; } } });