2017-08-21 19 views
0

アイテムのリストを保持する水平Recylcerビューがあります。各アイテムは、アイテムを表すためのテキストビューおよびイメージビュー(例えば、画像の上の正方形およびテキスト「正方形」の画像)を有する。レシラの表示は、自分自身の 相対レイアウトが画面の上部に配置されている内部です。私がする必要があるのは、リサイクラービューからイメージをドラッグして、そのイメージの外側にある別のレイアウトにドロップすることです。ただし、リサイクラビューからドラッグしたイメージは削除しないでください。代わりに、イメージのコピーを外部レイアウトに配置する必要があります。また、ユーザーが指を離したレイアウト内の正確な位置に画像をドロップする必要があります。これを達成する方法はありますか?イメージをRecyclerビューからドラッグアンドドロップして、そのイメージを別のレイアウトに配置する方法

この例は、ユーザーがゲームの世界にドラッグアンドドロップするオブジェクトのリストを持つゲームのようなものです。ここで

は、私が何を意味するか説明する例を示しますリサイクラービューの

example

アダプタクラス:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { 

private List<ListItems> listItems; 
private Context context; 

public RecyclerAdapter(List<ListItems> listItems, Context context) { 
    this.listItems = listItems; 
    this.context = context; 
} 

@Override 
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.layout_recycler_view_row_one, parent, false); 

    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

@Override 
public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int position) { 

    ListItems listItems = listItems.get(position); 

    holder.textView.setText(listItems.getItemName()); 
    holder.imageView.setImageResource(listItems.getImageDrawable()); 
} 


@Override 
public int getItemCount() { 
    return listItems.size(); 
} 

public class ViewHolder extends RecyclerView.ViewHolder { 

    public ImageView imageView; 
    public TextView textView; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     imageView = (ImageView) itemView.findViewById(R.id.item_image_view); 
     textView = (TextView) itemView.findViewById(R.id.item_name_text_view); 

    } 
} 

MainActivity.class:

public class MainActivity extends AppCompatActivity { 

RelativeLayout relativeLayoutMiddle; 

private RecyclerView recyclerView; 
private RecyclerView.LayoutManager layoutManager; 
private RecyclerView.Adapter adapter; 
private List<ListItems> listItems; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listItems = new ArrayList<>(); 

    for (int i = 0; i < 4; i++) { 
     if(i==0) 
     { 
      ListItems listItems = new ListItems("Square", R.drawable.square); 
      listItems.add(listItems); 
     } 
     else if(i==1) 
     { 
      ListItems listItems = new ListItems("Circle", R.drawable.circle); 
      listItems.add(listItems); 
     } 
     else if(i==2) 
     { 
      ListItems listItems = new ListItems("Rectangle", R.drawable.rectangle); 
      listItems.add(listItems); 
     } 
     else if(i==3) 
     { 
      ListItems listItems = new ListItems("Triangle", R.drawable.triangle); 
      listItems.add(listItems); 
     } 
    } 

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
    recyclerView.setHasFixedSize(true); 
    layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); 
    recyclerView.setLayoutManager(layoutManager); 
    adapter = new RecyclerAdapter(listItems, this); 
    recyclerView.setAdapter(adapter); 

    relativeLayoutMiddle = (RelativeLayout) findViewById(R.id.relativeLayoutMiddle); 

答えて

0

これは基本的にすることができを使用してほんの数行のコードで達成されました。

  1. コールView.startDragAndDrop
  2. DragEvent.ACTION_DROPためView.OnDragListener
  3. あなたのドロップコンテナに待ちを取り付けた後、あなたの RecyclerView.Adapter

あなたの形状を膨らませると位置付け、View.OnLongClickListenerを添付して、View.startDragAndDropを呼び出します。何かのように:

あなた Activityまたはどこでも View.setOnDragListenerを呼び出し、 DragEvent.ACTION_DROPが呼び出されたとき、我々はあなたが上 startDragAndDropと呼ばれる Viewのコピーを膨らませることができ、あなたの容器底部のレイアウトを膨らませるには
@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    final View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.layout_recycler_view_row_one, parent, false); 
    final ViewHolder holder = new ViewHolder(v); 
    final View shape = holder.imageView; 
    holder.itemView.setOnLongClickListener(v -> { 
     final ListItems item = listItems.get(holder.getAdapterPosition()); 
     final DragData state = new DragData(item, shape.getWidth(), shape.getHeight()); 
     final DragShadowBuilder shadow = new DragShadowBuilder(shape); 
     ViewCompat.startDragAndDrop(shape, null, shadow, state, 0); 
     return true; 
    }); 
    return holder; 
} 

public class DragData { 

    public final ListItems item; 
    public final int width; 
    public final int height; 

    public DragData(ListItems item, int width, int height) { 
     this.item= item; 
     this.width = width; 
     this.height = height; 
    } 

} 

。以下のような何か:

@Override 
public boolean onDrag(View v, DragEvent event) { 
    switch (event.getAction()) { 
     case DragEvent.ACTION_DRAG_ENTERED: 
      dropContainer.setBackgroundColor(GREEN); 
      break; 
     case DragEvent.ACTION_DRAG_EXITED: 
      dropContainer.setBackgroundColor(RED); 
      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      dropContainer.setBackgroundColor(WHITE); 
      break; 
     case DragEvent.ACTION_DROP: 
      final float dropX = event.getX(); 
      final float dropY = event.getY(); 
      final DragData state = (DragData) event.getLocalState(); 

      final ImageView shape = (ImageView) LayoutInflater.from(this).inflate(
        R.layout.view_shape, dropContainer, false); 
      shape.setImageResource(state.item.getImageDrawable()); 
      shape.setX(dropX - (float) state.width/2); 
      shape.setY(dropY - (float) state.height/2); 
      shape.getLayoutParams().width = state.width; 
      shape.getLayoutParams().height = state.height; 
      dropContainer.addView(shape); 
      break; 
     default: 
      break; 
    } 
    return true; 
} 

結果

+0

ViewCompat.startDragAndDropを呼び出すときに、私はエラーを取得しています。メソッドを解決できません。なぜどんなアイデア?私はminSDKVersionを変更しようとしましたが、うまくいかないようです。 –

+0

[あなたはおそらくcompat libを使用していません](https://developer.android.com/topic/libraries/support-library/packages.html#v4-compat)。 – adneal

関連する問題