繁体   English   中英

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

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

我在布局中有一个卡片视图,它有两个文本视图和一个图像视图,我有一个使用卡片视图来设置项目的回收站视图。 我想要实现的是在点击卡片视图时启动一个底部工作表

这是主活动中的代码

列表代码

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

    }

}

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

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

    }
});

从 RecyclerView.Adapter 调用 BottomSheetDialog Fragment。 试试这个对我来说效果很好。

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

你不能这样做:

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

您应该创建一个新的 Activity(一个新类),其中将包含您的 BottomSheetFragment 并使用意图启动该活动。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM