Android Drag and drop в Fragment с RecyclerView

У меня есть Fragment в котором естьRecyclerView. В java файле естьgenerateCardNumbers и он генерирует 30 пунктов меню, которые нельзя редактировать (Изменять текс, картинку и др.). Как сделать так чтобы я мог редактировать меню. Я новичок и поэтому не особо понимаю что и куда нужно писать. Знаю что нужно в адаптере задать определённы меню которые в самом фрагменте можно будет указывать, но как это сделать я не знаю. Помогите пожалуйста. Есть условие, у меня в адаптере уже есть drag and drop и он работает с теми меню которые генерирует generateCardNumbers, нужно чтобы меню продолжали работать с drag and drop но при этом я мог их редактировать. И ещё, я правда стараюсь изучить разработку приложений всеми силами и временем, и порой, сколько бы я не прочитал документации, я не могу понять как всё таки работает какой либо компонент, и в таком случае мне очень помогает простейший пример (практика) в котором можно понять как работает увидев своими глазами. К чему я это, если вам не трудно, разжуйте для меня информацию что бы можно было понять о чем речь, возможно это слишком наглая просьба, но всё же.

И так

1й файл Fragment, основной, в котором я ссылаюсь на xml фай, где находиться RecyclerView.

Также в нем я подключаю адаптер в котором уже идет, если так можно сказать, скелет компонентов.

public class FavoritesTabs extends Fragment {

    private static final int CARD_COUNT = 30;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_favorites_tabs, container, false);
    }

    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
        RecyclerView recyclerView = view.findViewById(R.id.RecyclerView);

        FavoritesAdapter favoritesAdapter = new FavoritesAdapter(generateCardNumbers());
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new FavoritesAdapter.CardItemTouchHelperCallback(favoritesAdapter));
        favoritesAdapter.setItemTouchHelper(itemTouchHelper);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(favoritesAdapter);
        itemTouchHelper.attachToRecyclerView(recyclerView);
    }

    private static int[] generateCardNumbers() {
        int[] cardNumbers = new int[CARD_COUNT];
        for (int i = 0; i < CARD_COUNT; i++) {
            cardNumbers[i] = i + 1;
        }
        return cardNumbers;
    }
}

Далее xml файл, в котором RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RecyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

</androidx.recyclerview.widget.RecyclerView>

И Адаптер

public class FavoritesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final int[] cardNumbers;

    private ItemTouchHelper itemTouchHelper;

    FavoritesAdapter(int[] cardNumbers) {
        this.cardNumbers = cardNumbers;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.fragment_card, parent, /* attachToRoot= */ false);
        return new CardViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position)
    {
        ((CardViewHolder) viewHolder).bind(cardNumbers[position], itemTouchHelper);
    }

    @Override
    public int getItemCount() {
        return cardNumbers.length;
    }

    void setItemTouchHelper(ItemTouchHelper itemTouchHelper) {
        this.itemTouchHelper = itemTouchHelper;
    }

    private static class CardViewHolder extends RecyclerView.ViewHolder {

        private final TextView titleView;
        private final View dragHandleView;

        private CardViewHolder(View itemView) {
            super(itemView);
            titleView = itemView.findViewById(R.id.cat_card_list_item_title);
            dragHandleView = itemView.findViewById(R.id.cat_card_list_item_drag_handle);
        }

        @SuppressLint("ClickableViewAccessibility")
        private void bind(int cardNumber, final ItemTouchHelper itemTouchHelper) {
            titleView.setText(String.format(Locale.getDefault(), "Card #%02d", cardNumber));
            dragHandleView.setOnTouchListener(
                    (v, event) -> {
                        if (event.getAction() == MotionEvent.ACTION_DOWN) {
                            itemTouchHelper.startDrag(CardViewHolder.this);
                            return true;
                        }
                        return false;
                    });
        }
    }
    static class CardItemTouchHelperCallback extends ItemTouchHelper.Callback {

        private static final int DRAG_FLAGS = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        private static final int SWIPE_FLAGS = 0;

        private final FavoritesAdapter favoritesAdapter;

        CardItemTouchHelperCallback(FavoritesAdapter favoritesAdapter) {
            this.favoritesAdapter = favoritesAdapter;
        }

        @Override
        public int getMovementFlags(
                @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            return makeMovementFlags(DRAG_FLAGS, SWIPE_FLAGS);
        }

        @Override
        public boolean onMove(
                @NonNull RecyclerView recyclerView,
                @NonNull RecyclerView.ViewHolder viewHolder,
                @NonNull RecyclerView.ViewHolder target) {
            int fromPosition = viewHolder.getAdapterPosition();
            int toPosition = target.getAdapterPosition();

            swapCards(fromPosition, toPosition, favoritesAdapter);
            return true;
        }

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

    static void swapCards(int fromPosition, int toPosition, FavoritesAdapter favoritesAdapter) {
        int fromNumber = favoritesAdapter.cardNumbers[fromPosition];
        favoritesAdapter.cardNumbers[fromPosition] = favoritesAdapter.cardNumbers[toPosition];
        favoritesAdapter.cardNumbers[toPosition] = fromNumber;
        favoritesAdapter.notifyItemMoved(fromPosition, toPosition);
    }
}

Так же xml файл в котором, вид меню которое размещается из адаптер. Надеюсь я понятно донес суть этим предложением.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <ScrollView style="@style/ScrollView_1">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <View style="@style/View_3" />

            <View style="@style/View_1" />

            <LinearLayout
                android:id="@+id/cat_card_list_item_card_1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:rippleColor="@color/color_6"
                android:background="@color/color_1"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/cat_card_list_item_title"
                    android:layout_width="wrap_content"
                    android:layout_height="48dp"
                    android:background="@color/color_6"
                    android:gravity="center"
                    android:textAllCaps="false"
                    android:textColor="@drawable/text"
                    android:textSize="24sp" />

                <ImageView
                    android:id="@+id/cat_card_list_item_drag_handle"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_gravity="end"
                    android:tint="@color/color_0"
                    android:padding="10dp"
                    android:src="@drawable/ic_baseline_menu_24"/>

            </LinearLayout>

            <View style="@style/View_1" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

Ответы (0 шт):