Ich habe eine Aktivität A mit einem Fragment frag2. Innerhalb des Fragments habe ich einen RecyclerView und einen Adapter, um eine Liste von benutzerdefinierten Klassenobjekten anzuzeigen. Das Hinzufügen von Objekten zu dem Adapter wird programmgesteuert behandelt. Ich habe einen Button in TwoFragment, der einen FragmentDialog öffnet. Ich möchte ein Objekt zu meinem Adapter hinzufügen, indem ich dieses Dialogfeld bestätige, aber es scheint, dass der Adapter null ist, wenn er vom FragmentDialog aufgerufen wird.Wie aktualisiert man das benutzerdefinierte RecyclerView von FragmentDialog?
Der gleiche Adapter ist nicht null, und funktioniert, wenn ich es aus dem Fragment OnClick aufrufen.
Darüber hinaus ist der Adapter nur nach der Drehung des Bildschirms Null, es funktioniert gut vor dem Drehen.
zwischen den beiden Fragmente zu kommunizieren I
Aktivität A
public void respond(String type) {
frag2.addSupport(type);
}
frag2
public RecyclerView rv;
public ArrayList<support> supports;
public myAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supports = new ArrayList<>();
adapter = new myAdapter(supports);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.fragment_two, container, false);
layout.setId(R.id.frag2);
if (savedInstanceState!=null)
{
supports = savedInstanceState.getParcelableArrayList("supports");
}
rv = (RecyclerView) layout.findViewById(R.id.rv);
adapter = new myAdapter(supports);
rv.setAdapter(myAdapter);
rv.setLayoutManager(new LinearLayoutManager(getActivity()));
rv.setItemAnimator(new DefaultItemAnimator());
@Override
public void onClick(View v) {
int id = v.getId();
switch (id){
case R.id.button1:
addSupport(type); // THIS WORKS ALWAYS, even after screen rotate
break;
case R.id.button2:
showDialog();
break;
}
}
public void showDialog(){
FragmentManager manager = getFragmentManager();
myDialog dialog = new myDialog();
dialog.show(manager, "dialog");
}
public void addSupport(String type){
adapter.addItem(new support(type)); // this line gives null pointer on adapter, but only if called after screen rotate and only if called from the dialog
}
Dialog
einen Kommunikator Klasse in Aktivität A. implementierencommunicator comm;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dialog, null);
comm = (myCommunicator) getActivity();
create = (Button) view.findViewById(R.id.button_ok);
create.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.button_ok)
{
// some controls to set type
comm.respond(type)
dismiss();
}
else {
dismiss();
}
myAdapter
public class myAdapter extends RecyclerView.Adapter<myAdapter.VH> {
private LayoutInflater inflater;
private ArrayList<support> data = new ArrayList<>();
// settings for viewholder
public myAdapter (ArrayList<support> data)
{
this.data=data;
}
public void addItem(support dataObj) {
data.add(dataObj);
notifyItemInserted(data.size());
}
}
logcat
FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method 'myAdapter.addItem(myObject)' on a null object reference
Ich hoffe, es gibt keine Fehler, verkürzte ich den Code für ein besseres Verständnis. Denken Sie daran, dass alles funktioniert, wenn ich den Bildschirm nie drehe.
Ich bin ein Anfänger mit Android und ich bin seit einigen Tagen mit diesem fest. Bitte, helfen Sie.
Vielen Dank für Ihre Antwort, was würden Sie anstelle von comm = (myCommunicator) empfehlen getActivity(); ? – Helike