简体   繁体   English

从 RecyclerViewAdapter 启动BottomSheet,它在onBindViewHolder 内扩展了RecyclerView.Adapter

[英]Launching BottomSheet from a RecyclerViewAdapter that extends with RecyclerView.Adapter inside onBindViewHolder

I have a Card View in a layout that has a two Text Views and an Image View and i have a Recycler View that uses the Card View to set items.我在布局中有一个卡片视图,它有两个文本视图和一个图像视图,我有一个使用卡片视图来设置项目的回收站视图。 What i want to achieve is to launch a Bottom Sheet when the Card View is tapped我想要实现的是在点击卡片视图时启动一个底部工作表

Here is the code in Main Activity这是主活动中的代码

Code for List列表代码

List<Item> lstItem;

    lstItem = new ArrayList<>();

    lstItem.add(new Item("Samsung","Smartphones","QualitlstItem = new ArrayList<>();y Samsung Smartphones",R.drawable.samsung,"21000"));
    lstItem.add(new Item("Lenovo","Smartphones","Quality Lenovo smartphones",R.drawable.lenovo,"15000"));

Code for attaching Recycler View Adapter to Main Activity将 Recycler View Adapter 附加到 Main Activity 的代码

        FragmentManager fragmentManager = getSupportFragmentManager();
        RecyclerViewAdapter2 mainAdapter2 = new RecyclerViewAdapter2(lstItem,fragmentManager);
        mainRecyclerView.setLayoutManager(new GridLayoutManager(this,3));
        mainRecyclerView.setAdapter(mainAdapter2);

Recycler View Adapter 2 Code Recycler 查看适配器 2 代码

        import android.content.Context;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.ImageView;
        import android.widget.TextView;


        import androidx.cardview.widget.CardView;
        import androidx.fragment.app.FragmentManager;
        import androidx.recyclerview.widget.RecyclerView;


        import java.util.List;

        public class RecyclerViewAdapter2 extends RecyclerView.Adapter<RecyclerViewAdapter2.MyViewHolder> {

        private Context context;
        private List<Item> data;
        private FragmentManager fragmentManager;

        public RecyclerViewAdapter2(List<Item> data, FragmentManager fragmentManager) {
        this.data = data;
        this.fragmentManager = fragmentManager;
    }


        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
          View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_items, parent, false);
          return new MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.tv_item_title.setText(data.get(position).getTitle());
        holder.price.setText(data.get(position).getPrice());
        holder.item_thumbnail.setImageResource(data.get(position).getThumbnail());

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                BottomSheetFragment bottomSheetFragment = new BottomSheetFragment();
                bottomSheetFragment.show(getSupportFragmentManager(), bottomSheetFragment.getTag());

            }
        });
    }

        @Override
        public int getItemCount() {
        return data.size();
        }

        public static class MyViewHolder extends RecyclerView.ViewHolder{

        TextView tv_item_title;
        TextView price;
        ImageView item_thumbnail;
        CardView cardView;


        public MyViewHolder(View itemView){
            super(itemView);

            tv_item_title = itemView.findViewById(R.id.itemTitleId);
            price = itemView.findViewById(R.id.priceId);
            item_thumbnail = itemView.findViewById(R.id.itemThumbnailId);
            cardView = itemView.findViewById(R.id.cardView);
        }

    }

}

This is where am having a problem: Launching Bottom Sheet on Card View Click:这是我遇到问题的地方:在卡片视图上启动底部工作表单击:

        BottomSheetFragment bottomSheetFragment = new BottomSheetFragment();
        bottomSheetFragment.show(getSupportFragmentManager(), bottomSheetFragment.getTag());

BottomSheetFragment Code; BottomSheetFragment 代码;

        import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.google.android.material.bottomsheet.BottomSheetDialogFragment;

public class BottomSheetFragment extends BottomSheetDialogFragment {



    public BottomSheetFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        return inflater.inflate(R.layout.bottomsheet1, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        //String s=getArguments().getString("myString");
    }
}

I have tried the following inside onBindViewHolder:我在 onBindViewHolder 中尝试了以下内容:

        @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.tv_item_title.setText(data.get(position).getTitle());
        holder.price.setText(data.get(position).getPrice());
        holder.item_thumbnail.setImageResource(data.get(position).getThumbnail());

        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                AppCompatActivity appCompatActivity = new AppCompatActivity();
                FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager();
                BottomSheetFragment bottomSheetFragment = new BottomSheetFragment();
                bottomSheetFragment.show(fragmentManager, bottomSheetFragment.getTag());

            }
        });
    }

Here is the Error:这是错误:

        E/AndroidRuntime: FATAL EXCEPTION: main
    Process: manu.apps.victortestapp, PID: 16271
    java.lang.IllegalStateException: Activity has been destroyed
        at androidx.fragment.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2114)
        at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:683)
        at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:637)
        at androidx.fragment.app.DialogFragment.show(DialogFragment.java:144)
        at manu.apps.victortestapp.RecyclerViewAdapter2$1.onClick(RecyclerViewAdapter2.java:52)
        at android.view.View.performClick(View.java:6726)
        at android.view.View$PerformClick.run(View.java:25434)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6524)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:451)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

I want to open BottomSheet when the Card View inside the Recycler View is tapped当点击 Recycler View 中的 Card View 时,我想打开 BottomSheet

In your onClick Listener, you need to use the fragmentManager you are passing to the Adapter.在您的 onClick 侦听器中,您需要使用传递给适配器的fragmentManager Instead you use getSupportFragmentManager() .相反,您使用getSupportFragmentManager() After changing this it works for me.改变这个后它对我有用。

holder.cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        BottomSheetFragment bottomSheetFragment = new BottomSheetFragment();
        // <-- Here change getSupportFragmentManager() to fragmentManager
        bottomSheetFragment.show(fragmentManager, bottomSheetFragment.getTag());

    }
});

to call BottomSheetDialog Fragment from RecyclerView.Adapter.从 RecyclerView.Adapter 调用 BottomSheetDialog Fragment。 Try this it worked fine for me.试试这个对我来说效果很好。

DialogFragment bottomSheetDialogFragment = new BottomsheetDialog();               
bottomSheetDialogFragment.show(((FragmentActivity)mContext).getSupportFragmentManager(), bottomSheetDialogFragment.getTag());

You can't do this:你不能这样做:

AppCompatActivity appCompatActivity = new AppCompatActivity();
FragmentManager fragmentManager = appCompatActivity.getSupportFragmentManager();
BottomSheetFragment bottomSheetFragment = new BottomSheetFragment();
bottomSheetFragment.show(fragmentManager, bottomSheetFragment.getTag());

You should create a new Activity ( a new class ) that will contain your BottomSheetFragment and start that activity using an intent.您应该创建一个新的 Activity(一个新类),其中将包含您的 BottomSheetFragment 并使用意图启动该活动。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法在我的类中使用 onBindViewHolder 实现 extends RecyclerView.Adapter - cannot implements with the onBindViewHolder in my class extends RecyclerView.Adapter 如何从RecyclerView.Adapter的OnBindViewHolder中的另一个列表中提取列表 - how to extract a list from another list in OnBindViewHolder in RecyclerView.Adapter 为什么在 RecyclerView.Adapter 的 onBindViewHolder 中添加 OnClickListener 被认为是不好的做法? - Why is adding an OnClickListener inside onBindViewHolder of a RecyclerView.Adapter considered bad practice? 在 RecyclerView.Adapter 内滚动到位置 - Inside RecyclerView.Adapter scroll to position 如何在扩展RecyclerView.Adapter的类中重新绑定视图 - How to rebind view in a class that extends RecyclerView.Adapter 什么是 RecyclerView.Adapter<MyAdapter.MyViewHolder> 以及它与 Android 中的 RecyclerView.Adapter 有何不同? - What is RecyclerView.Adapter<MyAdapter.MyViewHolder> and how it is different from RecyclerView.Adapter in Android? RecyclerView.Adapter类查询 - RecyclerView.Adapter Class Query 从RecyclerView.Adapter中删除项目会导致OutOfBounds异常 - Removing items from RecyclerView.Adapter causes OutOfBounds exception 如何从RecyclerView.Adapter类获取ArrayList - How get ArrayList from RecyclerView.Adapter class 将数据从 RecyclerView.Adapter 传递给 onClick 片段 - Passing data from RecyclerView.Adapter to fragment onClick
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM