0

正試圖從適配器調用,但我發現這是更正確的方式。在日誌中,所有傳輸都是正確的,我從適配器調用這個方法。 Itried chnging toContext(),但它也可以工作。爲什麼在從片段中調用新的Activity Intent時出錯?

錯誤的位置:

Process: pl.michalz.hideonscrollexample, PID: 2078 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
    at android.content.ComponentName.<init>(ComponentName.java:128) 
    at android.content.Intent.<init>(Intent.java:4449) 
    at pl.michalz.hideonscrollexample.fragment.PartThreeFragment.infoActivityCall(PartThreeFragment.java:122) 
    at pl.michalz.hideonscrollexample.adapter.parttwo.MyAdapter$ViewHolder.onClick(MyAdapter.java:83) 
    at android.view.View.performClick(View.java:5204) 
    at android.view.View$PerformClick.run(View.java:21153) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
在此代碼

public class PartThreeFragment extends Fragment { 

    //pridetas 
    ArrayList<Receptas> receptasAList = new ArrayList<>(); 
    MyAdapter myAdapter; 
    RecyclerView recyclerView; 
    RequestQueue requestQueue; 
    Receptas receptas; 
    InfoActivity infoActivity = new InfoActivity(); 
    private final String url1 = "http://smkbaig.esy.es/get_info_test.php"; 

    public static PartThreeFragment createInstance() { 
     PartThreeFragment partThreeFragment = new PartThreeFragment(); 
     Log.w("myApp", ">>partThree)"); 
     return partThreeFragment; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Log.w("myApp", "partThree>>"); 
     View view = inflater.inflate(R.layout.fragment_part_three, container, false); 
     recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     myAdapter = new MyAdapter(getActivity()); 
     recyclerView.setAdapter(myAdapter); 
     volleyJson(url1, ""); 

     return view; 
    } 

    public void volleyJson(String u, String q) { 
     String url = ""; 
     String query = ""; 
     if(u != ""){ 
      url = u; 
     } 
     if(q != ""){ 
      query = q; 
     } 

     Log.w("myApp", "volleyJson -started- "); 
     requestQueue = Volley.newRequestQueue(this.getActivity()); 
     JsonObjectRequest jsObjRequest = new JsonObjectRequest 
       (Request.Method.GET, url, (String) null, new Response.Listener<JSONObject>() { 

        @Override 
        public void onResponse(JSONObject response) { 
         try { 
          receptasAList.clear(); 
          JSONArray ja = response.getJSONArray("receptai"); 
          for (int i = 0; i < ja.length(); i++) { 

           JSONObject jsonObject = ja.getJSONObject(i); 
           receptas = new Receptas(); 
           receptas.setPav(jsonObject.getString("pav")); 
           //receptas.setApras(jsonObject.getString("apras")); 
           receptas.setIngred_sk(jsonObject.getString("ingred_sk")); 
           receptasAList.add(receptas); 
           Log.w("myApp", "receptasAList.add(receptas); " + receptasAList.get(0).getPav()); 
          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         //atliekamas po getRecceptas() 
         myAdapter.setReceptasList(receptasAList); 
         Log.w("myApp", "myAdapter.setReceptasList(receptasAList);"); 
//       myAdapter.notifyDataSetChanged(); 
         //mTextView.setText("Response: " + response.toString()); 
        } 
       }, 
         new Response.ErrorListener() { 
          @Override 
          public void onErrorResponse(VolleyError error) { 
           // TODO Auto-generated method stub 
          } 
         } 
       ); 

     requestQueue.add(jsObjRequest); 
     Log.w("myApp", "requestQueue.add(jsObjRequest);"); 
    } 

    public void refresh(String newTxt, Boolean submit){ 
     final List<Receptas> receptasFilter = myAdapter.filter(receptasAList, newTxt); 
     myAdapter.setFilter(receptasFilter, submit, getActivity()); 
    } 

    public void infoActivityCall(int position, Receptas receptas) 
    { 
     Log.w("myApp", "infoActivityCall return = " + position + " ; " + " re " + receptas.getPav()); 

     // - - - - - - - - - E R R O R H E R E - - - - - - - - - 

     Intent intent = new Intent(getActivity(), InfoActivity.class); 
     startActivity(intent); 
    } 

} 

編輯1:ViewHolder類調​​用內部public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     TextView itemTextViewPav, itemTextViewIngred_sk; 
     ArrayList<Receptas> receptasL; 
     PartThreeFragment partThreeFragment = new PartThreeFragment(); 

     public ViewHolder(View itemView, ArrayList<Receptas> receptasL) { 
      super(itemView); 
      this.receptasL = receptasL; 
      itemTextViewPav = (TextView) itemView.findViewById(R.id.itemTextViewPav); 
      itemTextViewIngred_sk = (TextView) itemView.findViewById(R.id.itemTextViewIngred_sk); 

      // Attach a click listener to the entire row view 
      itemView.setOnClickListener(this); 
     } 

     //- - - - - - - - - - - - - - C L I C K L I S T E N E R - - - - - - - - - - - - - - - - 
     // Handles the row being being clicked 
     @Override 
     public void onClick(View view) { 
      int position = getLayoutPosition(); // gets item position 
      Receptas receptas = receptasL.get(position); 
      // We can access the data within the views 

      Toast.makeText(view.getContext(), "Click /VH + ", Toast.LENGTH_SHORT).show(); 
      partThreeFragment.infoActivityCall(position, receptas); 

     } 
    } 
+0

你在哪裏調用'infoActivityCall'方法? – giannisf

+0

getActivity()爲null。當你的infoActivityCall()方法被調用時,看起來你的片斷已經從activity中分離出來了。 – Luis

回答

0

上下文爲null在ViewHolder的適配器onClick監聽器中,您可以放置​​適配器代碼嗎?

+0

補充說,感謝您的期待 – Edd

2

在第一個地方是不是一個好的做法,以打開從片段另一個活動,所以來看看this approach與活動,以傳達您的片段,然後創建你的意圖,如:

new Intent(ActualClass.this, NewClass.class); 
1

我覺得錯誤是在這條線

Volley.newRequestQueue(this.getActivity()); 

所以,我可以建議你的是創建類型爲活動一個全局變量數據,如

Activity mActivity; 

mActivity保存當前活動這樣

@Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     mActivity = activity; 
    } 

然後再每次使用mActivity

0

功能我想在活動叫:

public void infoActivity(Context context){ 

    Intent intent = new Intent(PartThreeActivity.this, InfoActivity.class); 
    startActivity(intent); 
} 

infoActivity()調用適配器ViewHolder。

我通過mActivity上下文片段myAdapter = new MyAdapter(mActivity);

由於@Shree Krishnam寫道,我救了活動作爲全局變量的數據類型:

@Override 
public void onAttach(Activity activity){ 
    super.onAttach(activity); 
    mActivity = activity; 
} 

和適配器我救了它:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    Context context; 
    //...code 
    public MyAdapter(Context context) { 
     layoutInflater = LayoutInflater.from(context); 
     this.context = context; 
    } 
    //...code 
} 

然後通過contextViewHolder並且像這樣使用它:

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    //...code... 

    @Override 
    public void onClick(View view) { 
     //...code 
     ((PartThreeActivity)context).infoActivity(context); 

    } 
} 
相關問題