簡體   English   中英

recyclerview 中的小吃店

[英]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 ,您將參數指定為itemholder.cardLayout 因此,小吃欄將出現在卡片布局下方。 您應該提供頁面的根視圖以使其顯示在頁面底部

有兩種方法可以實現這一點。 一種是在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();
     }
}

雖然第一種方法非常簡單,但第二種方法為您提供了更多的封裝、更清晰的代碼和對代碼的更多控制。

  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/Fragment View/ViewGroup/Layout傳遞給 Adapter。

而是將Callback/ListenerActivity/Fragment傳遞給 RecyclerView Adapter 這樣當項目被點擊時,你會觸發回調。 偵聽該回調的Activity/Fragment將被觸發,您現在可以顯示 Snackbar/Toast/CustomView...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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