Ce fragment est sur un ViewPager et il fait un okhttp obtenir avec une réponse de JSON. Le json est adapté sur un RecyclerView et quand je clique sur un enregistrement sur ce recyclerview il doit appeler une méthode putPasta() de Fragment mais j'obtiens NullPointerException quand je fais cette action.Sur la méthode d'appel d'adaptateur de fragment
Fragment:
public class PersonalizzataTab extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.personalizzata_layout, container,
PastaAdapter adapter = new PastaAdapter(getContext(), new PastaAdapter.AdapterInterface() {
@Override
public void putPasta() {
// the action called from adapter
}
});
fab1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SyncPasta syncPasta = new SyncPasta();
syncPasta.execute();
}
});
return view;
}
class SyncPasta extends AsyncTask {
@Override
protected Object doInBackground(Object[] params) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("link of php file")
.get()
.addHeader("cache-control", "no-cache")
.addHeader("postman-token", "4681c54c-3bd9-3d92-42f6-d7f9a68b4044")
.build();
try {
Response response = client.newCall(request).execute();
setPasta(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
public void setPasta(final String aResult) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
final JSONArray[] jsonArray = {null};
try {
jsonArray[0] = new JSONArray(aResult);
} catch (JSONException e) {
e.printStackTrace();
}
Pasta pasta;
ArrayList<Pasta> arrayListPasta = new ArrayList<Pasta>();
if (jsonArray[0] != null) {
for (int i = 0; i < jsonArray[0].length(); i++) {
JSONObject json = null;
try {
json = jsonArray[0].getJSONObject(i);
pasta = new Pasta(json.getString("pasta"), json.getDouble("prezzo"), json.getString("miniatura"), json.getString("miniature"));
arrayListPasta.add(pasta);
// Assign adapter to ListView
pastaAdapter = new PastaAdapter(getActivity(), arrayListPasta);
listViewBanner.setAdapter(pastaAdapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
});
}
Adaptateur:
public class PastaAdapter extends RecyclerView.Adapter<PastaAdapter.MyViewHolder> {
private Context mContext;
private List<Pasta> listaPasta;
AdapterInterface buttonListener;
public PastaAdapter (Context context, AdapterInterface buttonListener)
{
this.mContext = context;
this.buttonListener = buttonListener;
}
public interface AdapterInterface {
void putPasta();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public RelativeLayout layoutPasta;
public MyViewHolder(View view) {
super(view);
layoutPasta = (RelativeLayout) view.findViewById(R.id.layoutIngrediente);
}
}
public PastaAdapter(Context mContext, List<Pasta> listaPasta) {
this.mContext = mContext;
this.listaPasta = listaPasta;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_ingredienti_layout, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final Pasta pasta = listaPasta.get(position);
holder.layoutPasta.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonListener.putPasta();
}
}
});
}
@Override
public int getItemCount() {
return listaPasta.size();
}
}
Exception:
java.lang.NullPointerException: Attempt to invoke interface method 'void sgware.easyfood.PastaAdapter$AdapterInterface.buttonPressed()' on a null object reference
at sgware.easyfood.PastaAdapter$1.onClick(PastaAdapter.java:97)
at android.view.View.performClick(View.java:5226)
at android.view.View$PerformClick.run(View.java:21266)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5845)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
Où avez-vous mis en œuvre l'interface? – SripadRaj
Y a-t-il une raison pour laquelle vous créez l'adaptateur et l'écouteur dans onCreateView et non dans onViewCreated? –
Vous définissez l'adaptateur en tant que pastaAdapter = new PastaAdapter (getActivity(), arrayListPasta); listViewBanner.setAdapter (pastaAdapter); En raison de cela votre buttonListener dans l'adaptateur est null –