相对布局无法转换为RecyclerView

时间:2018-07-19 12:38:06

标签: java android android-recyclerview android-relativelayout

我正在从RecyclerViewAdapter通过RelativeLayout进入主活动并更改其布局参数。 用户从RecyclerView拖动一个项目,然后将其放在屏幕上的任何位置。

现在,如果我将项目设置为位图图像对象,然后再移动该对象,则拖放工作,因为它只是复制布局并将其转换为位图,并且它是同一视图的一部分。

但是然后我必须为每个项目等创建多个图像,这不是一个好主意。 因此,我想让用户从RV拖动到同一活动中的另一个布局。

但是问题是,当我从适配器传递布局并尝试设置其参数时,会出现以下错误消息:

android.widget.RelativeLayout$LayoutParams cannot be cast to android.support.v7.widget.RecyclerView$LayoutParams

当我调试器响起时,我看不到正在通过RV,它确实说它正在通过相对布局。但是检查错误消息后,我确实看到了以下内容:

              at android.support.v7.widget.RecyclerView.getChildViewHolderInt(RecyclerView.java:4375)
              at android.support.v7.widget.RecyclerView.findMinMaxChildLayoutPositions(RecyclerView.java:3868)
              at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3604)
              at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3408)

在调试器中,我检查了传递的布局,其父级是RecyclerView。

我正在尝试通过布局,因为它是没有父级RV的相对布局。

代码如下:

public FootballPitchMainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.player_name_and_top_scheme,
                parent,false);
        FootballPitchMainAdapter.ViewHolder vh = new FootballPitchMainAdapter.ViewHolder(v);
        return vh;

   holder.linearLayoutFull.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View v, DragEvent event) {
                if (event.getAction() == DragEvent.ACTION_DRAG_STARTED){
                    FootballPitchMain.passHolder(holder.linearLayoutFull);
                } else if (event.getAction() ==   DragEvent.ACTION_DRAG_ENDED)
                    v.setVisibility(View.VISIBLE);

                return true;
            }
        });


   public static void passHolder(RelativeLayout mViewHolder){
            viewHolder =  mViewHolder;
}



        @Override
        public boolean onDrag(View v, DragEvent event) {
            if (event.getAction() ==   DragEvent.ACTION_DROP){

                int x_cord = (int) event.getX();
                int  y_cord = (int) event.getY();
                layoutParams.leftMargin = x_cord;
                layoutParams.topMargin = y_cord;
                RelativeLayout.LayoutParams rLay = new RelativeLayout.LayoutParams(viewHolder.getWidth(),viewHolder.getHeight());
                rLay.leftMargin = x_cord;
                rLay.topMargin = y_cord;
                viewHolder.setLayoutParams(rLay);
            }
            return true;
        }

@ viewHolder.setLayoutParams(rLay)是它的中断点。

2 个答案:

答案 0 :(得分:0)

如果我正确阅读了代码,则您正在移动的视图以RecyclerView作为父视图。如果是这样,即使该视图可能是RecyclerView,该视图的布局参数也将是RelativeLayout的布局参数。

无论如何,即使您解决了此问题,我认为您可能还会发现从RecyclerView窃取视图还有其他问题。

我建议在删除视图时,创建一个 new 视图,该视图是要删除的视图的克隆,并将该视图添加到正在接收的新ViewGroup中风景。您将不得不从RecyclerView中删除该项目并清理视觉效果,但是我认为这是您最好的方法。

顺便说一句,关于这个将视图拖到RecyclerView之外的话题,我注意到了一些关于Stack Overflow的普遍兴趣。当您开始使用它时,可能值得将解决方案重新发布到这里。

答案 1 :(得分:0)

我必须解决的方法是在适配器中开始拖动时创建位图图像。 将位图传递到您想要的任何位置,一旦通过创建一个新的ImageView,将位图设置为ImageView,然后将dragListener设置为您打算放置的布局。 因此,如果不先将其转换为其他内容,就无法通过布局。

答案不是最好的IMO,但说实话,这是解决此问题的快速方法。