recyclerview 中的 Snackbar

Snackbar in recyclerview

如何在页面底部显示快餐栏?我想在点击喜欢时显示小吃店。我在 recycleview (crdLayout) 的项目中使用了 snackbar,因此它已显示在每个项目的底部 这是代码:

public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
            itemHolder.like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar snackbar = Snackbar
                        .make(itemHolder.crdLayout, "liked", Snackbar.LENGTH_LONG)         
                                snackbar1.show();
            }
        });

snackbar 每次都不会在页面底部弹出,而是出现在每个 cardview 的底部

在您的 Snackbar 中,您将参数指定为 itemholder.cardLayout。因此 snackbar 将出现在卡片布局下方。你应该给页面的根视图,让它出现在页面的底部

您可以通过两种方式实现这一目标。一种是在RecyclerViewAdapterclass的构造函数中传递rootview,将参数传递给Snackbar。另一种方法是在 ActivityFragment class 中使用回调方法调用 RecyclerViewAdapter class.

对于第一种方法,您只需将页面的rootView作为构造函数参数传递,并将参数传递给Snackbar

对于第二种方法,可以在RecyclerViewAdapterclass中创建一个接口,在构造函数中将接口实例作为参数传递,在接口中创建一个方法并通知方法该项目已被点击。然后您可以在 Activity class 本身中显示 Snackbar。看下面的代码,

public class YourActivity implements RecyclerViewAdapter.CallbackListener{
     View rootView;
     @Override
     protected void onCreate(Bundle savedInstanceState){
        //
        rootView = findViewById(R.id.my_root_view);
        // 
        //
        RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this);
        //
        //
     }

     @Override
     public void onItemClicked(){
         Snackbar snackbar = Snackbar.make(rootView, "liked", Snackbar.LENGTH_LONG);
         snackbar.show();             
     }
}

你的 RecyclerViewAdapter class 将是,

public class RecyclerViewAdapter {
    CallbackListener listener;
            
    public RecyclerViewAdapter (CallbackListener listener){
         this.listener = listener;
    }
        
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
         itemHolder.like.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             listener.onItemClicked();
            }
     });
    
     public interface CallbackListener{
         void onItemClicked();
     }
}

虽然第一种方法很简单,但第二种方法给你更多的封装,更简洁的代码和更多的代码控制。

  1. 在您现有的 Activity 布局中设置 CoordinatorLayout
  2. CoordinatorLayout 作为第一个参数 Snackbar.make()命令。

因此最后它应该是这样的:

public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {

            itemHolder.like.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    final View my_new_view = findViewById(R.id.myCoordinatorLayout); //define your CoordinatorLayout
                    Snackbar snackbar = Snackbar
                            .make(myCoordinatorLayout, "liked", Snackbar.LENGTH_LONG); //set CoordinatorLayout as first argument
                    snackbar1.show();
                }
            });

您的 Snackbar 显示在 CoordinatorLayout 的底部。

如果您尝试在整个屏幕上显示 Snackbar,不要将父 Activity/FragmentView/ViewGroup/Layout 传递给适配器。

而是将 Callback/ListenerActivity/Fragment 传递给 RecyclerView Adapter。这样,当单击项目时,您会触发回调。 Activity/Fragment 监听该回调将被触发,您现在可以显示 Snackbar/Toast/CustomView...