我正在尝试从我的 AlertDialog 中获取信息。单击我的 recyclerView 中的删除按钮后,系统会询问用户是否确定。如果"is",则应删除所选数据集。与this tutorial我尝试实现回调来获取所需的信息,但总是收到 NullPointerException。我不明白为什么。也许有人可以帮助我提供一些意见?
警报对话框:
public class deleteAlertFragment extends DialogFragment {
private OnAddFriendListener callback;
public interface OnAddFriendListener {
public void onAddFriendSubmit(String friendEmail);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
callback = (OnAddFriendListener) getTargetFragment();
} catch (ClassCastException e) {
throw new ClassCastException(
"Calling Fragment must implement OnAddFriendListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.frag_message)
.setPositiveButton(R.string.frag_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//ERROR!
callback.onAddFriendSubmit("Kartoffel");
}
})
.setNegativeButton(R.string.frag_abort,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
错误:
07-06 12:11:44.517: E/AndroidRuntime(1325): FATAL EXCEPTION: main
07-06 12:11:44.517: E/AndroidRuntime(1325): Process: com.holg.prinoviskalkulator, PID: 1325
07-06 12:11:44.517: E/AndroidRuntime(1325): java.lang.NullPointerException: Attempt to invoke interface method 'void com.holg.prinoviskalkulator.deleteAlertFragment$OnAddFriendListener.onAddFriendSubmit(java.lang.String)' on a null object reference
07-06 12:11:44.517: E/AndroidRuntime(1325): at com.holg.prinoviskalkulator.deleteAlertFragment$1.onClick(deleteAlertFragment.java:36)
07-06 12:11:44.517: E/AndroidRuntime(1325): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
07-06 12:11:44.517: E/AndroidRuntime(1325): at android.os.Handler.dispatchMessage(Handler.java:102)
07-06 12:11:44.517: E/AndroidRuntime(1325): at android.os.Looper.loop(Looper.java:135)
07-06 12:11:44.517: E/AndroidRuntime(1325): at android.app.ActivityThread.main(ActivityThread.java:5257)
07-06 12:11:44.517: E/AndroidRuntime(1325): at java.lang.reflect.Method.invoke(Native Method)
07-06 12:11:44.517: E/AndroidRuntime(1325): at java.lang.reflect.Method.invoke(Method.java:372)
07-06 12:11:44.517: E/AndroidRuntime(1325): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
07-06 12:11:44.517: E/AndroidRuntime(1325): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
RecycleViewAdapter:
public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.PersonViewHolder> implements OnAddFriendListener{
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView stintDate;
TextView stintDuration;
TextView stintStartTime;
TextView stintWage;
Button deleteButton;
PersonViewHolder(View itemView) {
super(itemView);
cv = (CardView)itemView.findViewById(R.id.card_view);
stintDate = (TextView)itemView.findViewById(R.id.txtDate);
stintStartTime = (TextView)itemView.findViewById(R.id.txtStartTime);
stintDuration = (TextView)itemView.findViewById(R.id.txtDuration);
stintWage = (TextView)itemView.findViewById(R.id.txtWage);
deleteButton = (Button) itemView.findViewById(R.id.back_delete);
}
}
List<Stint> stints;
Calendar cal;
DatabaseHandler db;
int y = 0;
RecycleViewAdapter(DatabaseHandler db){
this.stints = db.getAllStintsList();
this.db = db;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.single_card_layout, viewGroup, false);
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(final PersonViewHolder personViewHolder, final int i) {
cal = new GregorianCalendar(stints.get(i).year, stints.get(i).month, stints.get(i).day);
SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy",Locale.GERMAN);
personViewHolder.stintDate.setText(i+1 + ") " + sdf.format(cal.getTime()));
personViewHolder.stintStartTime.setText("" + stints.get(i).startTime);
personViewHolder.stintDuration.setText(stints.get(i).duration + " h");
personViewHolder.stintWage.setText(String.format("%.2f €",stints.get(i).wage));
personViewHolder.deleteButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
FragmentManager fm = ((Activity) v.getContext()).getFragmentManager();
deleteAlertFragment dialog = new deleteAlertFragment();
dialog.show(fm, "mydialog");
if(y==1){
db.deleteEntry(stints.get(i).id);
stints.remove(i);
notifyDataSetChanged();
personViewHolder.getAdapterPosition();
y=0;
}
}
});
}
@Override
public void onAddFriendSubmit(String friendEmail) {
y=1;
}
@Override
public int getItemCount() {
return stints.size();
}
}
最佳答案
您已经创建了变量callBack,但尚未创建它应该引用的对象。 尝试: 私有(private) OnAddFriendListener 回调 = new OnAddFriendListener(); 或者无论对象的构造函数是什么。
希望有帮助。
关于java - 回调抛出 NullPointerException( fragment 超出适配器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246609/