android – DialogFragment中的RecyclerView – >拖放(交换)动画滞后

我在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;
}

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...