gpt4 book ai didi

java - 从 FirebaseRecyclerAdapter 获取文档 ID 并将值传递给新页面

转载 作者:行者123 更新时间:2023-11-30 05:06:11 27 4
gpt4 key购买 nike

我有一个显示文档列表的 FirestoreRecyclerAdapter。我在列表中的每个项目旁边都有一个按钮。单击此按钮时,我想获取所选项目的唯一 ID,然后将用户带到显示该项目的个人详细信息的页面。

本质上我想将点击的文档的Id传递给下一页。但是,我的按钮在单击时抛出空指针异常。

此代码来 self 的 ClubAdapter 类。

public class ClubAdapter1 extends FirestoreRecyclerAdapter<Club, ClubAdapter1.ClubHolder> {

private String clubId;
private Context context;

public ClubAdapter1(@NonNull FirestoreRecyclerOptions<Club> options) {
super(options);
}

@Override
protected void onBindViewHolder(@NonNull ClubHolder holder, int position, @NonNull Club model) {
holder.lblName.setText(model.getClubName());
//getting the ID of the particular event clicked
clubId = getSnapshots().getSnapshot(position).getId();

holder.btnDetails.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(context, ViewSingleClub.class);
i.putExtra("id", clubId);
context.startActivity(i);
}
});
}

@NonNull
@Override
public ClubHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.clublist_layout, parent, false);
return new ClubHolder(v);
}

class ClubHolder extends RecyclerView.ViewHolder {

TextView lblName;
Button btnDetails;

public ClubHolder(@NonNull View itemView) {
super(itemView);

lblName = itemView.findViewById(R.id.lblName);
btnDetails = itemView.findViewById(R.id.btnDetails);
}
}
}

我总是在行中收到错误Intent i = new Intent(context, ViewSingleClub.class);我认为这可能与我的上下文变量引用本身有关,但也不确定我是否正确获取了 ID。有人可以帮忙吗?

这是我的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.marykate.marykatefordefyp, PID: 2718
java.lang.NullPointerException
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:3842)
at com.example.marykate.marykatefordefyp.ClubAdapter1$1.onClick(ClubAdapter1.java:36)
at android.view.View.performClick(View.java:4457)
at android.view.View$PerformClick.run(View.java:18491)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5336)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:681)
at dalvik.system.NativeStart.main(Native Method)

最佳答案

这是因为您正在分配“自身的上下文”。从初始化适配器的类传递上下文。

假设我有名称为“ClubAdapter”的适配器和名为“ClubClass”的调用类

在俱乐部类中:

ClubAdapter clubAdapter = new ClubAdapter(list, context);
// if you'r calling it from activity then pass "Activity.this" and if fragment then "getContext()" as context.
在 ClubAdapter

public class ClubAdapter extends RecyclerView.Adapter<ClubAdapter.ClubHolder> {
private Context context;
private List<String> list;


public ClubAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
}

@NonNull
@Override
public ClubHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_sample, viewGroup, false);
return new ClubHolder(itemView, context);
}


public class ClubHolder extends RecyclerView.ViewHolder {

private Context context;

private ClunHolder(@NonNull View itemView,Context context) {
super(itemView);
this.context = context;

}
}
}

或者你可以制作这样的界面。

public interface RecycleViewOnItemClickListener {
void onItemClick(int position);
}

并将其从调用类传递给您的适配器。

假设我有名称为“SampleAdapter”的适配器和名为“SampleClass”的调用类在“SampleClass”中,您可以将适配器中的接口(interface)作为参数传递。

SampleAdapter sampleAdapter = new SampleAdapter(list, new RecycleViewOnItemClickListener() {
@Override
public void onItemClick(int position) {
// do what you want to perform
}
});

在“俱乐部适配器”中

public class ClubAdapter extends RecyclerView.Adapter<ClubAdapter.ClubHolder> {
private RecycleViewOnItemClickListener recycleViewOnItemClickListener;
private List<String> list;


public ClubAdapter(List<String> list, RecycleViewOnItemClickListener recycleViewOnItemClickListener) {
this.list = list;
this.recycleViewOnItemClickListener = recycleViewOnItemClickListener;
}

@NonNull
@Override
public ClubHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_sample, viewGroup, false);
return new ClubHolder(itemView, recycleViewOnItemClickListener);
}


public class ClubHolder extends RecyclerView.ViewHolder {

private RecycleViewOnItemClickListener recycleViewOnItemClickListener;

private ClunHolder(@NonNull View itemView,RecycleViewOnItemClickListener recycleViewOnItemClickListener) {
super(itemView);
this.recycleViewOnItemClickListener = recycleViewOnItemClickListener;
//you can callback onItemClick method from here on button click event so it give callback in "ClubActivity".
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
recycleViewOnItemClickListener.onItemClick(getAdapterPosition());
}
});
}
}
}

关于java - 从 FirebaseRecyclerAdapter 获取文档 ID 并将值传递给新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553281/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com