微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐