Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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 – DialogFragment中的RecyclerView – >拖放(交换)动画滞后全部内容,希望文章能够帮你解决android – DialogFragment中的RecyclerView – >拖放(交换)动画滞后所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。