RecyclerView DialogFragment & # 8594; drag & drop (swap)

I use RecyclerViewin DialogFragment(for sure AlertDialog) with the drag & drop ( ItemTouchHelper.CallbackonMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)) function .

The problem is that when I move up or down, you raise (drag) the subject, the animation lags. I tried the same RecyclerViewwith Fragmentin Activityand it works smoothly. I suspect that the problem is that it Activityoccupies the entire screen, but DialogFragmentnot (a blurry background is displayed in the dialog box). I think some additional calculations are done by moving the element to AlertDialog.

Edited

My adapter class:

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.TabItemViewHolder> implements ItemTouchHelperAdapter {

    private List<Tab> tabs;

    public ListAdapter(List<Tab> tabs) {
        this.tabs = tabs;
    }

    @Override
    public TabItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_tab_list, parent, false);
        return new TabItemViewHolder(itemView);
    }


    @Override
    public void onBindViewHolder(TabItemViewHolder holder, final int position) {
        Tab tab = tabs.get(position);
        holder.tvTabName.setText(tab.getTabCategory().toString());
    }


    @Override
    public int getItemCount() {
        return tabs.size();
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                Collections.swap(tabs, i, i + 1);
            }
        } else {
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(tabs, i, i - 1);
            }
        }
        notifyItemMoved(fromPosition, toPosition);
    }

    @Override
    public void onItemDismiss(int position) {
        tabs.remove(position);
        notifyItemRemoved(position);
    }

    public static class TabItemViewHolder extends RecyclerView.ViewHolder {

        public TextView tvTabName;

        public TabItemViewHolder(final View itemView) {
            super(itemView);

            tvTabName = (TextView) itemView.findViewById(R.id.cl__tv_tab_name);


        }
    }
}

Functions void onItemMove(int fromPosition, int toPosition)and void onItemDismiss(int position)are called from ItemTouchHelper.

DialogFragment Class:

public Dialog onCreateDialog(Bundle savedInstanceState) {
    final RecyclerView recyclerView = (RecyclerView) getActivity().getLayoutInflater().inflate(R.layout.recycler_view, null);

    ListAdapter listAdapter = new ListAdapter (tabs);
    recyclerView.setAdapter(listAdapter );
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    SimpleItemTouchHelperCallback simpleItemTouchHelperCallback = new SimpleItemTouchHelperCallback(listAdapter);
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchHelperCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView);

    return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.title)
            .setView(recyclerView)
            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            }).create();

}
+4
2

, , ItemTouchHelper.Callback. .

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {

private final ItemTouchHelperAdapter mAdapter;

public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
    mAdapter = adapter;
}

@Override
public boolean isLongPressDragEnabled() {
    return true;
}



@Override
public boolean isItemViewSwipeEnabled() {
    return true;
}

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, swipeFlags);

}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                      RecyclerView.ViewHolder target) {
    mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    return true;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}

}

ItemTouchHelper.Callback . .

public interface ItemTouchHelperAdapter {


void onItemMove(int fromPosition, int toPosition);

void onItemDismiss(int position);

}

/**  * {@link ItemTouchHelper.Callback}.  *  * @author (ipaulpro)  */

.

@Override
public int getItemCount() {
    return data.size();
}

@Override
public void onItemMove(int fromPosition, int toPosition) {

    if (fromPosition < toPosition) {
        for (int i = fromPosition; i < toPosition; i++) {
            Collections.swap(data, i, i + 1);
        }
    } else {
        for (int i = fromPosition; i > toPosition; i--) {
            Collections.swap(data, i, i - 1);
        }
    }
    notifyItemMoved(fromPosition, toPosition);

}

@Override
public void onItemDismiss(int position) {
    data.remove(position);
    notifyItemRemoved(position);
}

/**** ***/

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     super.onCreateView(inflater, container, savedInstanceState);
    View root = inflater.inflate(R.layout.dialog_fragment_layout,container,false);
    list = (RecyclerView) root.findViewById(R.id.list);
    data = getResources().getStringArray(R.array.list);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    list.setLayoutManager(linearLayoutManager);
    ArrayList<String> listData = new ArrayList<>();
    listData.addAll(Arrays.asList(data));
    listAdapter = new ListAdapter(getActivity(),listData);
    list.setAdapter(listAdapter);
    SimpleItemTouchHelperCallback callback = new SimpleItemTouchHelperCallback(listAdapter);
    ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
    touchHelper.attachToRecyclerView(list);
    return root;
}
0

, . , AlertDialog.Build. - onCreateView(). - DialogFragment - RecyclerView ,

0

Source: https://habr.com/ru/post/1664986/


All Articles