大佬教程收集整理的这篇文章主要介绍了android – DialogFragment中的RecyclerView – >拖放(交换)动画滞后,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题是当我向上或向下移动(拖动)项目时动画滞后.我在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(); }
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; }
以上是大佬教程为你收集整理的android – DialogFragment中的RecyclerView – >拖放(交换)动画滞后全部内容,希望文章能够帮你解决android – DialogFragment中的RecyclerView – >拖放(交换)动画滞后所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。