java - 从 RecyclerViewAdapter 启动 BottomSheet,该 RecyclerViewAdapter 扩展了 onBindViewHolder 内的 RecyclerView.Adapter

标签 java android

我的布局中有一个卡片 View ,有两个 TextView 和一个 ImageView ,并且我有一个使用卡片 View 来设置项目的回收器 View 。我想要实现的是在点击卡片 View 时启动底部工作表

这是主 Activity 中的代码

列表代码

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"));

将 Recycler View Adapter 附加到 Main Activity 的代码

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

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

    }

}

这是我遇到问题的地方:在卡片 View 上启动底部工作表单击:

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

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

我在 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());

            }
        });
    }

这是错误:

        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)

我想在点击 Recycler View 内的 Card View 时打开 BottomSheet

最佳答案

在 onClick 监听器中,您需要使用传递给适配器的 fragmentManager。相反,您可以使用 getSupportFragmentManager()。更改此设置后,它对我有用。

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

    }
});

关于java - 从 RecyclerViewAdapter 启动 BottomSheet,该 RecyclerViewAdapter 扩展了 onBindViewHolder 内的 RecyclerView.Adapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57165580/

相关文章:

java - 疯狂的想法 : Connect . NET 和 SAP with SAP JCo 使用 IKVM.NET

java - 检测 Whatsapp 通话并暂停 ExoPlayer

java - 加载页面后隐藏进度条

android - 在 fragment 中注册和注销 BroadcastReceiver

javascript - JS 服务器已经在运行 React Native 应用程序

c# - Xamarin Resource.Designer.cs 不刷新新 ID 或事件

java - 解析 "+"整数时无效 int

java - 将 JRE 与 Java 应用程序捆绑在一起

java - EditText.setError() 单行

java - Gradle同步问题: CreateProcess error=2