- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在一个 LinearLayout
中有 TextView
和 ImageView
。我想以这种方式将第一个 LinearLayout
拖到第二个 LinearLayout
,当我将第一个线性拖放到第二个 LinearLayout
时,它的 TextView
和 ImageView
应该放在第一个 LinearLayout
中,反之亦然。我已经完成研发,发现可以将布局从第一个拖放到第二个,但第二个布局不在第一个布局中。
问题是布局没有得到交换。我可以从第一拖放到第二,但无法从第一拖放到第二。
下面是我的 fragment :
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);
}
}
请帮帮我,请提出解决方案。谢谢。
最佳答案
You can do this with
RecyclerView
withGridLayoutManager
instead of severalLinearLayout
's as below:
步骤:
在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);
}
}
这里是结果
希望能满足你的需求
关于android - 如何在 android 中使用拖放框架从一个 LinearLayout 交换到另一个 LinearLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57787880/
这个问题在这里已经有了答案: Difference between Property and Field in C# 3.0+ (10 个答案) 关闭 10 年前。 我不明白静态属性之间的区别: p
当元素被拖放时,有没有办法从被拖动的元素中获取 id(或其他属性值)? 例如,在左侧,我有一堆 div,我可以将图像放入其中。右边有一个 div 用来保存图像。当我将图像从右侧拖动到左侧的 div 时
每当我更改其中一个类属性时,我想设置一个修改标志,如下所示 public bool Modified { get; set; } public bool Enabled { get; set { Mo
由于某种原因,我下面的代码曾经可以正常工作,但现在却引发了一个异常: public static async Task HttpPut(string inUrl, string inFilePath)
为什么将 ; 放在最佳实践中?在函数定义的末尾。 例如 var tony = function () { console.log("hello there"); }; 优于: var tony
我在容器内有一个位图。当我拖动容器时,光标变为编辑文本形状,图像也跳到光标的右下角(好像我从左上角拿着图像并拖动它)。 这是我的代码,所以你可以看到我有 RTFM: function createIc
这个问题已经有答案了: C# 3.0 auto-properties — useful or not? [closed] (17 个回答) 已关闭 6 年前。 当我让 Visual Studio 20
以类中的以下代码为例: public class Employee : IEntity { public string FirstName { get; set; } public s
我有 json 数据: { "products": [ { "productId" : 0, "productImg" : "../img/product-ph
这个问题在这里已经有了答案: What is the difference between a field and a property? (33 个答案) 关闭 9 年前。 我在一本书上找到这样声
我正在设置多个方法,想知道如何继续将一个变量(“顶部”变量)传递给不同的方法。 主要方法: public static void Main(string[] args) { i
我正在尝试使用 crontab 编写一个简单的任务,将一些文件从本地复制到 HDFS。我的代码是这样的: #!/bing/ksh ANIO=$(date +"%Y") MES=$(date +"%m"
有人可以告诉我如何使用这个解决方案来解决我的问题吗?我也想限制 id 中包含文本“not”的节点的拖/放。 jsTree drag and drop restrict folders by class
我的情况如下 - 我正在对可能包含链接行的表进行排序: row 1 row 2 row 3 row 4 row 5 我需要的是禁止在.linked-to-p
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我在理解似乎不一致的方案中的破坏性操作时遇到问题。即为什么下例中bar没有变化 (define foo '(a b)) (define bar foo) (set! foo '(c d)) foo >
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我在理解似乎不一致的方案中的破坏性操作时遇到问题。即为什么下例中bar没有变化 (define foo '(a b)) (define bar foo) (set! foo '(c d)) foo >
我在我的 Web 应用程序中使用 Ajax ControlToolkit 中的 ModalPopupExtender。我将其 Drag 属性设置为 true,但是当我拖动弹出面板并将其放到新位置时,它
所以,基于this answer ,我有一组可以拖放并卡入到位的 div。唯一的问题是,可拖动的 div 具有不同的高度,我需要它们始终捕捉到目标的底部,而不是顶部。 您可以在this JsFiddl
我是一名优秀的程序员,十分优秀!