我有一个可编辑模式下允许拖放的RecyclerView。一旦用户退出编辑模式,我需要禁用拖放功能。
我已经尝试更改ItemTouchCallback中的移动标志和isLongPressDragEnabled,但无济于事。长按仍然会开始拖动事件。
我的当前解决方案是分离和重新加载片段,然后在再次进入编辑模式时添加回调,但我希望有些更简洁的解决方案我可能错过了。
回调:
public class ItemTouchCallback extends ItemTouchHelper.Callback {
private final ItemTouchHelperAdapter mAdapter;
public ItemTouchCallback(ItemTouchHelperAdapter mAdapter) {
this.mAdapter = mAdapter;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.START | ItemTouchHelper.END |ItemTouchHelper.DOWN | ItemTouchHelper.UP;
return makeMovementFlags(dragFlags, 0);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return false;
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemClear();
}
}
}
适配器:
public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}
片段:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_rectangle_switches, container, false);
ButterKnife.bind(this, rootView);
// Note: Title set by AmbientPagerFragment
layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
adapter = new SwitchAdapter(switchList, dimmableList, ghostList, editMode, bus);
recyclerView.setAdapter(adapter);
displaySwitches();
return rootView;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.icon_edit:
editMode = true;
changeEditMode();
break;
case R.id.icon_cancel:
editMode = false;
changeEditMode();
break;
}
return super.onOptionsItemSelected(item);
}
public void changeEditMode() {
bus.post(new EditModeEvent(editMode));
reattachFragment();
displaySwitches();
getActivity().invalidateOptionsMenu();
}
private void displaySwitches() {
if (editMode) {
callback = new ItemTouchCallback((ItemTouchHelperAdapter) adapter);
mTouchHelper = new ItemTouchHelper(callback);
mTouchHelper.attachToRecyclerView(recyclerView);
}
}
private void reattachFragment(){
ft = getFragmentManager().beginTransaction();
ft.detach(this).attach(this).commit();
}
谢谢。