[英]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.