当我偶然发现这个视频时,我正在查看Google的Material文档.它显示了一个卡片项目,可以向右滑动以收藏项目.
我想镜像这种行为但多次失败.我能找到的所有库和教程都是关于swipe-to-delete
.我试图将两个视图堆叠在一起,其中顶部的一个应该被刷,以便下面的一个可见.我尝试用这个来实现这个ItemTouchHelper
,但是这个类似乎只能促进swipe-to-delete
和move
重新排序列表操作.
如何实现此滑动操作?
你需要使用 ItemTouchHelper
这是一个实用程序类,用于添加滑动dismiss
和拖放支持RecyclerView
.
它适用于一个RecyclerView
和一个Callback类,它配置启用哪种类型的交互,并在用户执行这些操作时接收事件.
下面是示例代码如何使用ItemTouchHelper
与RecyclerView
StackActivity
import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import java.util.ArrayList; public class StackActivity extends AppCompatActivity { RecyclerView myRecyclerView; private ArrayListarrayList = new ArrayList<>(); FavAdapter favAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stack); myRecyclerView = findViewById(R.id.myRecyclerView); myRecyclerView.setLayoutManager(new LinearLayoutManager(this)); myRecyclerView.setHasFixedSize(true); // here i'm adding dummy data inside list addDataInList(); // setting adapter to RecyclerView favAdapter = new FavAdapter(this, arrayList); myRecyclerView.setAdapter(favAdapter); new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { // when user swipe thr recyclerview item to right remove item from avorite list if (direction == ItemTouchHelper.RIGHT) { favAdapter.addToFav(viewHolder.getAdapterPosition(), false); } // when user swipe thr recyclerview item to left remove item from avorite list else if (direction == ItemTouchHelper.LEFT) { favAdapter.addToFav(viewHolder.getAdapterPosition(), true); } } }).attachToRecyclerView(myRecyclerView); } //method to add dummy data inside ourlist private void addDataInList() { arrayList.add(new ItemModel("Item 1", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 2", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 3", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 4", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 5", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 6", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 7", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 8", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 9", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 10", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 11", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 12", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 13", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 14", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 15", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 16", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 17", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 18", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 19", "https://i.stack.imgur.com/1dWdI.jpg", false)); arrayList.add(new ItemModel("Item 20", "https://i.stack.imgur.com/1dWdI.jpg", false)); } }
activity_stack布局
FavAdapter类
import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import java.util.ArrayList; public class FavAdapter extends RecyclerView.Adapter{ private Context context; private ArrayList arrayList = new ArrayList<>(); public FavAdapter(Context context, ArrayList arrayList) { this.cOntext= context; this.arrayList = arrayList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.custom_fav_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // here i'm check that if item is already added in favorite or not //based on boolean flag i'm managed to set weather the item is in favorite or not // this flag is also use full to keep state of out favorite when we scroll our recyclerview holder.ivFavImage.setImageResource(arrayList.get(position).isFavorite() ? R.drawable.ic_favorite : R.drawable.ic_fav_white); holder.tvProductName.setText(arrayList.get(position).getItemName()); Glide.with(context) .load(arrayList.get(position).getImageUrl()) .apply(new RequestOptions(). placeholder(R.drawable.ic_placeholder) .error(R.drawable.ic_error)) .into(holder.ivProductImage); } // this method is used to add or remove item from favorite list when use swipe the recyclerview item using ItemTouchHelper public void addToFav(int position, boolean flag) { arrayList.get(position).setFavorite(flag); notifyDataSetChanged(); } @Override public int getItemCount() { return arrayList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { ImageView ivProductImage, ivFavImage; TextView tvProductName; public ViewHolder(View itemView) { super(itemView); ivProductImage = itemView.findViewById(R.id.ivProductImage); ivFavImage = itemView.findViewById(R.id.ivFavImage); tvProductName = itemView.findViewById(R.id.tvProductName); ivFavImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (arrayList.get(getAdapterPosition()).isFavorite()) { arrayList.get(getAdapterPosition()).setFavorite(false); } else { arrayList.get(getAdapterPosition()).setFavorite(true); } notifyDataSetChanged(); } }); } } }
custom_fav_layout布局
ItemModel damodel类
public class ItemModel { boolean isFavorite; String ItemName,imageUrl; public ItemModel( String itemName, String imageUrl,boolean isFavorite) { this.isFavorite = isFavorite; ItemName = itemName; this.imageUrl = imageUrl; } public boolean isFavorite() { return isFavorite; } public void setFavorite(boolean favorite) { isFavorite = favorite; } public String getItemName() { return ItemName; } public void setItemName(String itemName) { ItemName = itemName; } public String getImageUrl() { return imageUrl; } public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } }
R.drawable.ic_favorite
drawable.ic_fav_white
https://www.youtube.com/watch?v=GKD-SDPWD3k&feature=youtu.be
有关信息,您可以查看以下文章
Android将RecyclerView Swipe添加到删除和撤消
使用RecyclerView的Android滑动菜单
RecyclerView滑动删除比您想象的更容易
Android RecyclerView滑动以删除示例按钮并撤消
Android RecyclerView:可滑动项目
如果你想去任何图书馆而不是检查这个
SwipeToDelete
滑动式-RecyclerView
itemtouchhelper扩展