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>