【问题标题】:Snackbar in recyclerview回收站视图中的小吃店
【发布时间】:2021-10-01 14:08:33
【问题描述】:

如何在页面底部显示小吃栏?我想在点击喜欢时显示小吃栏。我在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 每次都不会在页面底部弹出,而是出现在每个卡片视图的底部

【问题讨论】:

  • 其中一个答案对您有帮助吗?或者您需要进一步的帮助?
  • 是的。它完全奏效了。但是如果我想为snackbar设置一个动作来改变物品持有者的图片,我该如何在我的活动中做到呢?

标签: java android android-recyclerview android-snackbar


【解决方案1】:

在您的Snackbar 中,您将参数指定为itemholder.cardLayout。所以 snackbar 将出现在卡片布局下方。您应该给页面的根视图以使其显示在页面底部

有两种方法可以实现这一目标。一种是在RecyclerViewAdapter类的构造函数中传递rootview,并将参数传递给Snackbar。另一种方法是在您的 ActivityFragment 类中使用回调方法来调用您的 RecyclerViewAdapter 类。

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

对于第二种方法,你可以在RecyclerViewAdapter类中创建一个接口,在构造函数中将接口实例作为参数传递,在接口中创建一个方法,并在项目被点击时通知该方法。然后你可以在你的Activity 类本身中显示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 类将是,

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();
     }
}

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

【讨论】:

    【解决方案2】:
    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 的底部。

    【讨论】:

      【解决方案3】:

      如果您尝试全屏显示 Snackbar,不要将父级 Activity/FragmentView/ViewGroup/Layout 传递给适配器。

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

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 2021-07-10
        • 1970-01-01
        • 2020-07-25
        • 2018-09-27
        • 1970-01-01
        相关资源
        最近更新 更多