Как да използвате ItemTouchHelper и неговото обратно извикване или да внедрите персонализирани?

Забелязах тези библиотеки и нямах търпение да ги използвам в приложението си. Моят RecyclerView използва StaggeredGridLayoutManager, за да организира viewHolders и съм записал следния код:

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
            ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END,
            ItemTouchHelper.START | ItemTouchHelper.END) {
        @Override
        public boolean onMove(RecyclerView recyclerView,
                              RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            mAdapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            return true;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            mAdapter.remove(viewHolder.getAdapterPosition());
        }
    });
    helper.attachToRecyclerView(mRecyclerView);

Има два проблема:

  1. Плъзгането на елемент няма да промени неговите alpha на deltaX.

  2. Представете си, че има 3 елемента в RecyclerView (което има 2 колони):

    • the first is a middle-size one;
    • вторият е по-малък от първия;
    • третият е най-големият.

Ако преместя третия на първо място, превъртете RecyclerView надолу (другите елементи няма да повлияят на първите 3) и след това нагоре, вторият и третият ще бъдат напълно същите.

Изглежда, че трябва да напиша персонализиран ItemTouchHelper, за да добавя alpha анимация, за да реша първия проблем и че не съм използвал тези класове правилно и по този начин съм причинил втория проблем.

В резултат на това коя е най-добрата проба за използване на ItemTouchHelper? Или как да внедрите персонализиран? Благодаря предварително за всички отговори или коментари.


comment
Търсене в Google ме доведе до този отговор: stackoverflow.com/a/30644208/1326147 къде се използват.   -  person Armfoot    schedule 11.06.2015
comment
@Armfoot съжалявам, че не показах това, от което наистина имам нужда преди. Прочетох този отговор преди и знаех как да използвам SimpleCallback за ItemTouchHelper. Всъщност обаче искам да знам как да внедря персонализиран ItemTouchHelper и неговото обратно извикване. Извинявай отново.   -  person ywwynm    schedule 11.06.2015
comment
няма проблем, тогава, моля, редактирайте въпроса си (заглавие и тяло), като се позовавате точно на това как да внедрите персонализиран ItemTouchHelper и неговото обратно извикване: повече хора може да помогнат, ако покажете, че сте направили проучване по темата и сте се опитали да направите нещо по въпроса сами.   -  person Armfoot    schedule 11.06.2015
comment
@Armfoot Благодаря за вашите предложения и подобрих въпросите си. ясно ли е сега Нямам достатъчно репутация, за да покажа снимки, за да опиша проблема си възможно най-точно.   -  person ywwynm    schedule 11.06.2015
comment
Въпросът ви вече е ясен, особено примерите, които предоставихте, ще помогнат много по-добре, добре направено! (повдигнато)   -  person Armfoot    schedule 11.06.2015
comment
@Armfoot Благодаря ви много!!! Ще следя вашите подобрения при всички въпроси, които задавам в бъдеще.   -  person ywwynm    schedule 11.06.2015


Отговори (1)


Според коментарите в ItemTouchHelper.Callback искате да замените методите onChildDraw или onChildDrawOver за тези dX, dY стойности.

Вижте също getDefaultUIUtil и имплементациите на ItemTouchUIUtil (което извикват onChildDraw и onChildDrawOver). Коментарът на getDefaultUIUtil демонстрира как да го използвате във връзка със замяна на onChildDraw и onChildDrawOver (въпреки че примерите погрешно връщат логическа стойност за обработка).

Ето бърз пример, ако искате да добавите 5 към надморската височина по подразбиране в Lollipop:

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

        if (Build.VERSION.SDK_INT >= 21 && isCurrentlyActive && !isElevated) {
            final float newElevation = 5f + ViewCompat.getElevation(viewHolder.itemView);
            ViewCompat.setElevation(viewHolder.itemView, newElevation);
            isElevated = true;
        }
    }

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        isElevated = false;
    }
person prodaea    schedule 29.06.2015
comment
ItemTouchUIUtil на Lollipop вече го прави, но по някакъв начин сянката не се рисува :( - person Oleksii Malovanyi; 14.07.2015