Как мне получить текущую позицию при перетаскиваниии в RecyclerView с анимацией Dragging

342
09 апреля 2017, 01:36

Как мне получить текущую позицию при перетаскиваниии:

Переменная ChildPosition
переменная ParentPosition
Перетаскивание происходит в методе swap.
В данном случае я получаю позицию всех элементов.
int firstPosition, int secondPosition. Позиции нажатого элемента и следующего, но мне это не надо, мне надо получить позицию группы в которой он находится сейчас и какая у него позиция в данной группе.

Вообщем надо чтобы в методе swap было также как в методе onBindChildViewHolder

Будто это не ExpandedRecyclerView, а ListView.

Поэтому не знаю как получить позицию элемента и в какой группе он находится в данный момент.

compile 'com.bignerdranch.android:expandablerecyclerview:2.1.1'

public class RecipeAdapter extends ExpandableRecyclerAdapter
        <Recipe,Ingredient,RecipeAdapter.RecipeViewHolder,RecipeAdapter.IngredientViewHolder> {
    Context context;
    public RecipeAdapter(@NonNull List<Recipe> parentList, Context context) {
        super(parentList);
        this.context = context;
    }
    /**
     * Primary constructor. Sets up {@link #mParentList} and {@link #mFlatItemList}.
     * <p>
     * Any changes to {@link #mParentList} should be made on the original instance, and notified via
     * {@link #notifyParentInserted(int)}
     * {@link #notifyParentRemoved(int)}
     * {@link #notifyParentChanged(int)}
     * {@link #notifyParentRangeInserted(int, int)}
     * {@link #notifyChildInserted(int, int)}
     * {@link #notifyChildRemoved(int, int)}
     * {@link #notifyChildChanged(int, int)}
     * methods and not the notify methods of RecyclerView.Adapter.
     *
     * @param parentList List of all parents to be displayed in the RecyclerView that this
     *                   adapter is linked to
     */
    public RecipeAdapter(@NonNull List<Recipe> parentList) {
        super(parentList);
    }
    @NonNull
    @Override
    public RecipeViewHolder onCreateParentViewHolder(@NonNull ViewGroup parentViewGroup, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.adap_main_group,parentViewGroup,false);
        return new RecipeViewHolder(view);
    }
    @NonNull
    @Override
    public IngredientViewHolder onCreateChildViewHolder(@NonNull ViewGroup childViewGroup, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.adap_main_item,childViewGroup,false);
        return new IngredientViewHolder(view);
    }
    @Override
    public void onBindParentViewHolder(@NonNull RecipeViewHolder parentViewHolder, int parentPosition, @NonNull Recipe parent) {
        parentViewHolder.txtGroup.setText("GROUP");
    }
    @Override
    public void onBindChildViewHolder(@NonNull IngredientViewHolder childViewHolder, int parentPosition, int childPosition, @NonNull Ingredient child) {
        childViewHolder.txtProfText.setText("CHILD");
    }
    public void swap(RecyclerView recyclerView, int firstPosition, int secondPosition, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target){
        Collections.swap(mFlatItemList, firstPosition, secondPosition);
        notifyParentMoved(firstPosition,secondPosition);
    }
    class RecipeViewHolder extends ParentViewHolder {
        private TextView txtGroup;
        public RecipeViewHolder(View itemView) {
            super(itemView);
            txtGroup = (TextView) itemView.findViewById(R.id.txtGroup);
        }
    }
    class IngredientViewHolder extends ChildViewHolder {
        private TextView txtProfText;
        public IngredientViewHolder(View itemView) {
            super(itemView);
            txtProfText = (TextView) itemView.findViewById(R.id.txtProfText);
        }
    }
}

Сам интерфейл Swap выглядит вот так

public class MovieTouchHelper extends ItemTouchHelper.SimpleCallback {
    private RecipeAdapter recipeAdapter;
    public MovieTouchHelper(RecipeAdapter recipeAdapter){
        super(ItemTouchHelper.UP | ItemTouchHelper.DOWN,0);
        this.recipeAdapter = recipeAdapter;
    }
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        recipeAdapter.swap(recyclerView,viewHolder.getAdapterPosition(), target.getAdapterPosition(),viewHolder,target);
        return true;
    }
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    }
}

Если кто сможет помочь то могу скинуть исходники, В инете видел много библиотек вроде Ultimate, Expandebla и т.д., но все без толку. Это не то. То там кода много и доков мало, то еще какие то проблемы.

Видео ExpandableRecyclerView

Answer 1

Позицию можно получить из onBindChildViewHolder А после использовать в swap

Answer 2

Возьмите этот драггер/свайпер

Android-ItemTouchHelper - я использую этот и у меня все работает - и драггинг и свайп.

И перестаньте ругаться - это вас не красит.

READ ALSO
Добавить таблицу по нажатии кноки JavaFX

Добавить таблицу по нажатии кноки JavaFX

Разработайте приложение "Модификация одномерного массива", которое позволяет пользователю:

261
Какие пакеты api android и java совпадают полность?

Какие пакеты api android и java совпадают полность?

Где можно узнать какие пакеты полностью совпадают в Java 8 и Android 4x и выше? Какие пакеты совпадают полностью? Например java

271
Cгенерировать таблицу TableView

Cгенерировать таблицу TableView

Как сгенерировать таблицу, с необходимым количеством столбцов, равным количеству элементов массива?

222