我正在从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)是它的中断点。
答案 0 :(得分:0)
如果我正确阅读了代码,则您正在移动的视图以RecyclerView
作为父视图。如果是这样,即使该视图可能是RecyclerView
,该视图的布局参数也将是RelativeLayout
的布局参数。
无论如何,即使您解决了此问题,我认为您可能还会发现从RecyclerView
窃取视图还有其他问题。
我建议在删除视图时,创建一个 new 视图,该视图是要删除的视图的克隆,并将该视图添加到正在接收的新ViewGroup
中风景。您将不得不从RecyclerView
中删除该项目并清理视觉效果,但是我认为这是您最好的方法。
顺便说一句,关于这个将视图拖到RecyclerView
之外的话题,我注意到了一些关于Stack Overflow的普遍兴趣。当您开始使用它时,可能值得将解决方案重新发布到这里。
答案 1 :(得分:0)
我必须解决的方法是在适配器中开始拖动时创建位图图像。 将位图传递到您想要的任何位置,一旦通过创建一个新的ImageView,将位图设置为ImageView,然后将dragListener设置为您打算放置的布局。 因此,如果不先将其转换为其他内容,就无法通过布局。
答案不是最好的IMO,但说实话,这是解决此问题的快速方法。