Android - 在RecyclerView中锁定项目

时间:2016-06-01 13:45:28

标签: android android-recyclerview

我有一个ItemTouchHelper的问题,我有一个ArrayList,我在RecyclerView中显示上下拖动项目。但有些项目我想锁定它们(不能拖动)。这是我的代码:

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
        @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
                    ItemTouchHelper.DOWN | ItemTouchHelper.UP);
        }

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

            int positionHolder = viewHolder.getAdapterPosition();
            int positionTarget = target.getAdapterPosition();
            Log.e(TAG, "onMove: "+positionHolder+"----"+positionTarget );
            positionInclu = mAdapter.getCashesSize() > 0 ? 0 : -1;
            if(positionInclu == 0) {
                positionExclu= mAdapter.getExcludedSize() > 0 ? mAdapter.getCashesSize()+1 : -1;
            }
            else {
                positionExclu = 0;
            }
            if(positionHolder == 0 || positionTarget == 0 || positionHolder == positionExclu || positionTarget == positionExclu){
                mAdapter.notifyItemMoved(positionHolder,positionHolder);
                return false;
            }
            if((positionHolder < positionExclu && positionTarget > positionExclu)||(positionHolder > positionExclu && positionTarget < positionExclu)) {
                mAdapter.notifyItemMoved(positionHolder,positionHolder);
                return false;
            }


            if(isFirst) {
                listFisrt.addAll(mAdapter.getAccountList());
                isFirst = false;
            }
            if(positionHolder < positionExclu || positionInclu == -1 || positionExclu == -1) {
                Collections.swap(mAdapter.getAccountList(), viewHolder.getAdapterPosition() - 1, target.getAdapterPosition() - 1);
                mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            }
            else {
                Collections.swap(mAdapter.getAccountList(), viewHolder.getAdapterPosition() - 2, target.getAdapterPosition() - 2);
                mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            }

            ArrayList<AccountItem> listAccountAfterEdit = mAdapter.getAccountList();
            int length = listAccountAfterEdit.size();

            for (int i = 0; i < length; i++) {
                listAccountAfterEdit.get(i).setmSortIndex(i);
            }

            if(!isEquals(listAccountAfterEdit, listFisrt)) {
                txtSave.setVisibility(View.VISIBLE);
            }
            else {
                txtSave.setVisibility(View.INVISIBLE);
            }
            return true;
        }

        @Override
        public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {
            return super.canDropOver(recyclerView, current, target);
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

        }
    });

positionInclu和positionExclu是我想要锁定的位置(在recyclerview中的位置)

1 个答案:

答案 0 :(得分:0)

最后,在 ItemTouchHelper 类中进行了大量研究之后,我像这样解决了它。

我所做的是将标志设置为ACTION_STATE_IDLE,我要在其中停止拖放。希望它能帮助像我这样的人。

以下是Kotlin版本。如果有人在JAVA中需要相同的东西,我可以将其转换。

//defines the enabled move directions in each state (idle, swiping, dragging).
    override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
        // The position i want to lock
        if (list[viewHolder.adapterPosition].trim().isEmpty()){
            return makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.DOWN or ItemTouchHelper.UP)
        }
        // The position i want to lock
        if (viewHolder.adapterPosition == list.size - 1){
            return makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.DOWN or ItemTouchHelper.UP)
        }
        // else enabling ACTION_STATE_DRAG
        return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
                ItemTouchHelper.DOWN or ItemTouchHelper.UP or ItemTouchHelper.START or ItemTouchHelper.END)
    }