added state changing by swipe for unmoved items to adapter

This commit is contained in:
Vologhat
2022-07-20 17:55:54 +03:00
parent d127a84b07
commit b92fa69628
5 changed files with 78 additions and 13 deletions
@@ -18,6 +18,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -36,6 +37,7 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
private List mSelectedItems;
private List mDisabledItems;
private List mUnmovedItems;
private IViewHolderBinder mBinder;
private int mMinSelectedItems = -1;
@@ -44,6 +46,7 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
public CategorizedAdapter(List selectedItems, List disabledItems, IViewHolderBinder binder) {
this.mSelectedItems = selectedItems;
this.mDisabledItems = disabledItems;
this.mUnmovedItems = new ArrayList();
this.mBinder = binder;
}
@@ -52,6 +55,10 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
this.mMaxSelectedItems = max;
}
public void addUnmovedItem(Object item) {
mUnmovedItems.add(item);
}
public int getItemViewType(int i) {
return i == 0 || mSelectedItems.size() + 1 == i ? CATEGORY_TITLE : MOVING_ITEM;
}
@@ -60,6 +67,20 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
return i <= mSelectedItems.size() ? SELECTED_STATE : DISABLED_STATE;
}
public boolean isUnmovedItem(int index) {
if (getItemViewType(index) == MOVING_ITEM) {
Object curr;
if (getTabType(index) == SELECTED_STATE) {
curr = mSelectedItems.get(index - 1);
return mUnmovedItems.contains(curr);
} else {
curr = mDisabledItems.get(index - mSelectedItems.size() - 2);
return mUnmovedItems.contains(curr);
}
}
return false;
}
@NonNull
@Override
public CategorizedViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
@@ -146,12 +167,28 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
@Override
public void onItemDismiss(int index) {
if (getItemViewType(index) == MOVING_ITEM ) {
Object curr;
if (getTabType(index) == SELECTED_STATE) {
curr = mSelectedItems.get(index - 1);
if (!mUnmovedItems.contains(curr)) return;
mSelectedItems.remove(curr);
mDisabledItems.add(0, curr);
notifyItemMoved(index, mSelectedItems.size() + 1);
} else {
curr = mDisabledItems.get(index - mSelectedItems.size() - 2);
if (!mUnmovedItems.contains(curr)) return;
mDisabledItems.remove(curr);
mSelectedItems.add(0, curr);
notifyItemRemoved(index);
notifyItemInserted(1);
}
}
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
if (toPosition == 0)
if (toPosition == 0 || isUnmovedItem(toPosition))
return false;
Object curr;
@@ -160,16 +197,13 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
if (getTabType(toPosition) == DISABLED_STATE && min)
return false;
curr = mSelectedItems.get(fromPosition - 1);
if (mUnmovedItems.contains(curr))
return false;
if (getItemViewType(toPosition) == CATEGORY_TITLE) {
if (min)
return false;
mSelectedItems.remove(fromPosition - 1);
mDisabledItems.add(curr);
for (int i = mDisabledItems.size() - 2; i >= 0; i--) {
var tmp = mDisabledItems.get(i + 1);
mDisabledItems.set(i + 1, mDisabledItems.get(i));
mDisabledItems.set(i, tmp);
}
mDisabledItems.add(0, curr);
} else {
Collections.swap(mSelectedItems, fromPosition - 1, toPosition - 1);
}
@@ -178,6 +212,8 @@ public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.
if (getTabType(toPosition) == SELECTED_STATE && max)
return false;
curr = mDisabledItems.get(fromPosition - mSelectedItems.size() - 2);
if (mUnmovedItems.contains(curr))
return false;
if (getItemViewType(toPosition) == CATEGORY_TITLE) {
if (max)
return false;
@@ -20,8 +20,8 @@ public class ItemMovingCallback extends ItemTouchHelper.Callback {
}
@Override
public boolean isItemViewSwipeEnabled(){
return false;
public boolean isItemViewSwipeEnabled() {
return true;
}
@Override
@@ -29,12 +29,16 @@ public class ItemMovingCallback extends ItemTouchHelper.Callback {
int dragFlags = mAdapter.getItemViewType(viewHolder.getAdapterPosition()) == CategorizedAdapter.MOVING_ITEM
? ItemTouchHelper.UP | ItemTouchHelper.DOWN
: 0;
return makeMovementFlags(dragFlags, 0);
int swipeFlags = mAdapter.getItemViewType(viewHolder.getAdapterPosition()) == CategorizedAdapter.MOVING_ITEM
&& mAdapter.isUnmovedItem(viewHolder.getAdapterPosition())
? ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
: 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction){
mAdapter.onItemDismiss(viewHolder.getItemViewType());
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
@Override
@@ -24,6 +24,8 @@ import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
import ru.vtosters.lite.ui.components.ItemMovingCallback;
import ru.vtosters.lite.ui.components.SuperAppEditorManager;
import ru.vtosters.lite.utils.Globals;
import ru.vtosters.lite.utils.LayoutHelper;
import ru.vtosters.lite.utils.Themes;
public class SuperAppEditorFragment extends BaseToolbarFragment {
@@ -38,6 +40,19 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
container.setOrientation(LinearLayout.VERTICAL);
content.addView(container, new FrameLayout.LayoutParams(-1, -1));
TextView message = new TextView(getContext());
message.setText(Globals.getString("superapp_editor_message"));
message.setTextSize(16.0f);
message.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
message.setTextColor(Themes.getTextAttr());
message.setPadding(
Globals.convertDpToPixel(10),
Globals.convertDpToPixel(10),
Globals.convertDpToPixel(10),
0
);
container.addView(message, LayoutHelper.createLinear(-1, -2));
LinearLayout buttonsContainer = new LinearLayout(getContext());
buttonsContainer.setPadding(
convertDpToPixel(13),
@@ -79,6 +94,14 @@ public class SuperAppEditorFragment extends BaseToolbarFragment {
: manager.getDisabledTabs().get(pos - manager.getSelectedTabs().size() - 2);
holder.bindMovingItem(item.title);
});
manager.getSelectedTabs().forEach(item -> {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
manager.getDisabledTabs().forEach(item -> {
if (item.type.equals("menu"))
adapter.addUnmovedItem(item);
});
var recyclerView = new RecyclerView(getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+1
View File
@@ -5419,6 +5419,7 @@
<string name="docknumbers">Счётчики в докбаре</string>
<string name="docknumberssum">Отключение не работает в интерфейсе для планшетов</string>
<string name="dockbar_tab_titles">Показ заголовков вкладок в докбаре</string>
<string name="superapp_editor_message">Для отключения/включения неподвижного элемента проведите по нему вправо или влево</string>
<string name="fcmtokenfixed">Уведомления были восстановлены!</string>
<string name="fcmtokenget">FCM токен получен</string>
<string name="fcmtokenrem">FCM токен удален</string>
+1
View File
@@ -5571,6 +5571,7 @@ Warning! It can cause long downloads of user lists if there are a lot of users i
<string name="docknumbers">Counters in dockbar</string>
<string name="docknumberssum">"Disabling doesn't work in the tablet interface"</string>
<string name="dockbar_tab_titles">Show dockbar item titles</string>
<string name="superapp_editor_message">For activate/disable unmoved element, swipe it to right or left, please</string>
<string name="fcmtokenfixed">Notifications have been restored!</string>
<string name="fcmtokenget">FCM token received</string>
<string name="fcmtokenrem">FCM token deleted</string>