2017-09-14 2 views
-1

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) 
+0

Où avez-vous mis en œuvre l'interface? – SripadRaj

+0

Y a-t-il une raison pour laquelle vous créez l'adaptateur et l'écouteur dans onCreateView et non dans onViewCreated? –

+0

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 –

Répondre

0

Ajouter constructeur adaptateur comme

public PastaAdapter(Context mContext, List<Pasta> listaPasta, AdapterInterface buttonListener) { 
     this.mContext = mContext; 
     this.listaPasta = listaPasta; 
    this.buttonListener=buttonListener; 
    } 

et appel dans le fragment

pastaAdapter = new PastaAdapter(getActivity(), arrayListPasta, new PastaAdapter.AdapterInterface() { 
     @Override 
     public void putPasta() { 
      // the action called from adapter 
     } 
    }); 
    listViewBanner.setAdapter(pastaAdapter); 
+0

Je le fais mais il obtient NullPointerException – GiacomoZ

+0

@GiacomoZ Vous partagez un logcat incorrect votre interface ne contient pas la méthode buttonPressed() –