Я использую RecyclerView
в DialogFragment
(точно AlertDialog
) с & сопротивления капли функциональности (ItemTouchHelper.Callback
->onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
).RecyclerView в DialogFragment -> перетащить и падение (своп) анимация отстает
Проблема в том, что когда я перемещаюсь вверх или вниз, поднимается (перемещается), то анимация отстает. Я пробовал тот же RecyclerView
с Fragment
в Activity
и он работает гладко. Я подозреваю, что проблема заключается в том, что Activity
занимает весь экран и DialogFragment
нет (в диалоговом окне отображается размытый фон). Я думаю, что некоторые дополнительные вычисления сделаны, перемещая элемент в AlertDialog
.
Edited
Мой адаптер Класс:
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);
}
}
}
Функции void onItemMove(int fromPosition, int toPosition)
и void onItemDismiss(int position)
вызываются из ItemTouchHelper
.
DialogFragment класс:
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();
}
Можете добавить код, который вы, возможно, пробовали? –
@NileshSingh Это стандартный класс RecyclerView.Adapter, который реализует функции перемещения и увольнения элементов. Я уверен, что проблема в другом месте, потому что этот адаптер работает нормально в Fragment/Activity, но лагов при использовании в DialogFragment. – AppiDevo
вы можете проверить этот пример -> [RecycleViewInDialogFragment] (https://github.com/CabezasGonzalezJavier/RecyclerViewInDialogFragment) – Cabezas