实现SwipeMenuListView特定item的右滑menu无效

来源:互联网 发布:mysql还原数据库 编辑:程序博客网 时间:2024/05/01 22:42

项目中增加需求:

根据不同来源的数据,修改展示页面及响应。



对于之前的数据来源,定为“来源一”  

       新的特殊数据来源,定为“来源二


一、对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;

@Overridepublic int getViewTypeCount() {   // menu type count   return 2;}@Overridepublic 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中添加的

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



0 0