簡體   English   中英

如何在android中使用拖放框架從一個LinearLayout切換到另一個LinearLayout

[英]How to swap from one LinearLayout to another LinearLayout using drag and drop framework in android

我在一個LinearLayoutTextViewImageView 當我將第一個LinearLayout拖放到第二個LinearLayout ,我想以這種方式將第一個LinearLayout拖動到第二個LinearLayout ,它的TextViewImageView應該在第一個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);
    }
}

請幫助我,並請建議解決方案。 謝謝。

您可以使用RecyclerViewGridLayoutManager而不是幾個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM