我在DialogFragment中使用RecyclerView(精确地是AlertDialog),具有拖放功能(itemtouchhelper.Callback – > onMove(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder,RecyclerView.ViewHolder target)).
问题是当我向上或向下移动(拖动)项目时动画滞后.我在Activity中尝试了与Fragment相同的RecyclerView,它运行顺畅.我怀疑问题是Activitytakes全屏和DialogFragment没有(对话框周围显示模糊的背景).我想在AlertDialog中移动项目时会进行一些额外的计算.
编辑
我的适配器类:
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 - 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,int which) { } }).create(); }
解决方法
问题似乎在你的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 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 Paul Burke(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 + 1); } } else { for (int i = fromPosition; i > toPosition; i--) { Collections.swap(data,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,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; }