[英]view cannot cast to linearlayout Drag Drop images from 1 linearlayout to another
[英]How to swap from one LinearLayout to another LinearLayout using drag and drop framework in android
我在一個LinearLayout
有TextView
和ImageView
。 當我將第一個LinearLayout
拖放到第二個LinearLayout
,我想以這種方式將第一個LinearLayout
拖動到第二個LinearLayout
,它的TextView
和ImageView
應該在第一個LinearLayout
,反之亦然。 我已經完成了研發,我發現將布局從第一個拖放到第二個,但第二個布局沒有出現在第一個布局中。
問題是布局沒有得到交換。 我可以從第一個拖放到第二個,但無法從第一個拖到第二個。
以下是我的片段:
public class MoreDestinationFragment extends Fragment implements View.OnClickListener, View.OnTouchListener, View.OnDragListener {
private OnFragmentInteractionListener mListener;
private LinearLayout llNews;
public MoreDestinationFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_more_destination, container, false);
llNews = view.findViewById(R.id.ll_new);
llNews.setOnClickListener(this);
llNews.setOnTouchListener(this);
llNews.setOnDragListener(this);
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.ll_new:
Navigation.findNavController(view).navigate(R.id.action_moreDestinationFragment_to_newsDestinationFragment);
break;
}
@Override
public boolean onDrag(View layoutview, DragEvent dragevent) {
int action = dragevent.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
Log.d("xxxxxxx", "Drag event started");
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d("xxxxxxx", "Drag event entered into " + layoutview.toString());
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.d("xxxxxxx", "Drag event exited from " + layoutview.toString());
break;
case DragEvent.ACTION_DROP:
Log.d("xxxxxxx", "Dropped");
View view = (View) dragevent.getLocalState();
ViewGroup owner = (ViewGroup) view.getParent();
owner.removeView(view);
LinearLayout container = (LinearLayout) layoutview;
container.addView(view);
view.setVisibility(View.VISIBLE);
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.d("xxxxxxx", "Drag ended");
break;
default:
break;
}
return true;
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(null, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
}
請幫助我,並請建議解決方案。 謝謝。
您可以使用
RecyclerView
和GridLayoutManager
而不是幾個LinearLayout
來做到這一點,如下所示:
腳步:
將以下依賴項添加到 gradle app 模塊中
// RecyclerView
implementation 'androidx.recyclerview:recyclerview:1.0.0'
// CardView
implementation 'androidx.cardview:cardview:1.0.0'
主要布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</androidx.recyclerview.widget.RecyclerView>
列表項布局(RecyclerView 的)
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginBottom="4dp"
android:clickable="true"
android:elevation="4dp"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
card_view:cardCornerRadius="10dp"
card_view:cardUseCompatPadding="true"
tools:ignore="UnusedAttribute">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="4dp">
<ImageView
android:id="@+id/imThumbnail"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
tools:background="@drawable/ic_android_black_24dp" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="Android" />
</LinearLayout>
</androidx.cardview.widget.CardView>
要在 RecyclerView 中填充的項目的模型類
public class Item {
private String mTitle;
private int mThumbnail;
public String getTitle() {
return mTitle;
}
public Item(String title, int thumbnail) {
this.mTitle = title;
mThumbnail = thumbnail;
}
public void setTitle(String title) {
this.mTitle = title;
}
public int getThumbnail() {
return mThumbnail;
}
public void setThumbnail(int thumbnail) {
mThumbnail = thumbnail;
}
}
RecyclerView 適配器
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
List<Item> mItems;
public Adapter(ArrayList items) {
mItems = items;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.bindViews(mItems.get(position));
}
@Override
public int getItemCount() {
return mItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView mTitle;
ImageView mThumbnail;
ViewHolder(@NonNull View itemView) {
super(itemView);
mTitle = itemView.findViewById(R.id.tvTitle);
mThumbnail = itemView.findViewById(R.id.imThumbnail);
}
void bindViews(Item item) {
mTitle.setText(item.getTitle());
mThumbnail.setImageResource(item.getThumbnail());
}
}
}
最后是主要行為
利用ItemTouchHelper
類拖動功能並使用attachToRecyclerView()
方法將其附加到RecyclerView
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ArrayList<Item> mItems;
private Adapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
populateItems();
mAdapter = new Adapter(mItems);
RecyclerView recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
recyclerView.setAdapter(mAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP |
ItemTouchHelper.DOWN |
ItemTouchHelper.LEFT |
ItemTouchHelper.RIGHT,
0) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
moveItem(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
});
itemTouchHelper.attachToRecyclerView(recyclerView);
}
private void populateItems() {
mItems = new ArrayList<>();
mItems.add(new Item("Android", R.drawable.ic_android_black_24dp));
mItems.add(new Item("Archive", R.drawable.ic_archive_black_24dp));
mItems.add(new Item("Alarm", R.drawable.ic_access_alarm_black_24dp));
mItems.add(new Item("Block", R.drawable.ic_block_black_24dp));
mItems.add(new Item("CAll", R.drawable.ic_call_black_24dp));
mItems.add(new Item("Android", R.drawable.ic_android_black_24dp));
mItems.add(new Item("Archive", R.drawable.ic_archive_black_24dp));
mItems.add(new Item("Alarm", R.drawable.ic_access_alarm_black_24dp));
mItems.add(new Item("Block", R.drawable.ic_block_black_24dp));
mItems.add(new Item("CAll", R.drawable.ic_call_black_24dp));
}
private void moveItem(int oldPos, int newPos) {
Item temp = mItems.get(oldPos);
mItems.set(oldPos, mItems.get(newPos));
mItems.set(newPos, temp);
mAdapter.notifyItemMoved(oldPos, newPos);
}
}
結果在這里
希望滿足您的需求
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.