0

Я хочу передать мои строки JSON из фрагмента на другой вид деятельности, так делают интерфейс между фрагментом и активности, но когда обед приложение получить нулевое исключение из этой строки из моего фрагмента: adapterCalljson.MethodCallbackjson(jsonStr);интерфейс между фрагментом и активностью не работает

это мой попробовать до сих пор:

интерфейс класса:

public interface AdapterCalljson { 
    void MethodCallbackjson(String jsonn); 
} 

фрагмент:

public class maghalat extends Fragment { 

    private View myFragmentView; 
    private RecyclerView recyclerView; 
    private DataAdapter adapter; 
    private String TAG = MainActivity.class.getSimpleName(); 
    public ProgressDialog pDialog; 
    List<jsonContent> listcontent=new ArrayList<>(); 

    public int dog=1; 
    public String url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts"; 

    public int id; 

    AdapterCalljson adapterCalljson; 

    public String json; 
    public String jsonStr; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof AdapterCalljson) { 
      adapterCalljson = (AdapterCalljson) context; 
     } else { 
      throw new RuntimeException(context + " must implement AdapterCalljson"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     adapterCalljson = null; 
    } 
    public interface AdapterCalljson { 

     void MethodCallbackjson(String json); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     myFragmentView = inflater.inflate(R.layout.maghalat, container, false); 


     adapterCalljson.MethodCallbackjson(json); 
     asyncRun(); 


     return myFragmentView; 
    } 
     public void asyncRun(){ 
     if(isNetworkConnected()) { 
      new GetContacts().execute(); 
     } else 
     { 
      Toast.makeText(getActivity().getApplicationContext(), "دستگاه شما به اینترنت متصل نیست!", Toast.LENGTH_LONG).show(); 
     } 
    } 


    public class GetContacts extends AsyncTask<Void, Void, Void> { 


    @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(getActivity()); 
      pDialog.setMessage("Please wait..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      HttpHandler sh = new HttpHandler(); 

      // Making a request to url and getting response 
      jsonStr = sh.makeServiceCall(url); 


      Log.e(TAG, "Response from url: " + jsonStr); 

      if (jsonStr != null) { 
       try { 

        JSONObject jsonObj = new JSONObject(jsonStr); 




        id=jsonObj.getInt("pages"); 

        JSONArray posts = jsonObj.getJSONArray("posts"); 

        for (int i = 0; i < posts.length(); i++) { 
         JSONObject c = posts.getJSONObject(i); 

         jsonContent jsonContent=new jsonContent(); 

         jsonContent.title=c.getString("title"); 

         jsonContent.content=c.getString("content"); 

         //img 
         JSONObject post_img=c.getJSONObject("thumbnail_images"); 
         for (int j=0;j<post_img.length();j++) 
         { 
          JSONObject v=post_img.getJSONObject("mom-portfolio-two"); 
          jsonContent.imgurl=v.getString("url"); 
         } 
         jsonContent.pages=id; 
         jsonContent.curpage=dog; 
         listcontent.add(jsonContent); 

        } 

       } catch (final JSONException e) { 
        Log.e(TAG, "Json parsing error: " + e.getMessage()); 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getActivity().getApplicationContext(), 
            "Json parsing error: " + e.getMessage(), 
            Toast.LENGTH_LONG) 
            .show(); 
         } 
        }); 
       } 
      } else { 
       Log.e(TAG, "Couldn't get json from server."); 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getActivity().getApplicationContext(), 
           "Couldn't get json from server. Check LogCat for possible errors!", 
           Toast.LENGTH_LONG) 
           .show(); 
        } 
       }); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 

      pDialog.dismiss(); 
      recyclerView=(RecyclerView)myFragmentView.findViewById(R.id.recycler_view); 
      recyclerView.setHasFixedSize(true); 
      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
      recyclerView.setLayoutManager(layoutManager); 

      adapter=new DataAdapter(getActivity(), listcontent, new AdapterCallback() { 
       @Override 
       public void MethodCallbackgo(String data) { 

        Integer s=null; 
        try { 
         s= Integer.valueOf(data); 
        }catch (NumberFormatException e) 
        { 
        } 
        if (s!=null && s>=1 && s<=id) 
        { 
         dog= Integer.parseInt(data); 
         url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts"; 
         new GetContacts().execute(); 
        }else 
        { 
         Toast.makeText(getActivity().getApplicationContext(),"صفحه پیدا نشد",Toast.LENGTH_SHORT).show(); 
        } 
       } 

       @Override 
       public void MethodCallbacknext() { 

        if (dog<id) 
        { 
         dog += 1; 
         url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts"; 
         new GetContacts().execute(); 

        }else { 
         Toast.makeText(getActivity().getApplicationContext(),"این آخرین صفحه است",Toast.LENGTH_SHORT).show(); 
        } 
       } 

       @Override 
       public void MethodCallbackprev() { 
        if (dog!=1) 
        { 
         dog-=1; 
         url = "http://memaraneha.ir/category/%d9%85%d9%82%d8%a7%d9%84%d8%a7%d8%aa/page/"+String.valueOf(dog)+"/?json=get_recent_posts"; 
         new GetContacts().execute(); 
        }else{ 
         Toast.makeText(getActivity().getApplicationContext(),"این اولین صفحه است",Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 
      recyclerView.setAdapter(adapter); 

      json=jsonStr; 


     } 
    } 
+0

Um. Вы никогда не назначали 'adapterCalljson' ни для чего. –

+0

ваш адаптер является пустым, вам нужно иметь нулевую проверку. –

+0

Кроме того, я не думаю, что вы понимаете, как работает «асинхронный». 'jsonStr' также является нулевым в точке, где вы вызываете этот метод –

ответ

0

Вы не назначили объект adapterCalljson. Предполагая, что вы реализуете AdapterCalljson в принимающей деятельности, назначать его из контекста onAttach:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof AdapterCalljson) { 
     adapterCalljson = (AdapterCalljson) context; 
    } else { 
     throw new RuntimeException(context + " must implement AdapterCalljson"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    adapterCalljson = null; 
} 

public interface AdapterCalljson { 

    void MethodCallbackjson(String json); 

} 
+0

, поэтому я добавляю вашу часть кодов в свой фрагмент, но получаю исключение из этой строки: throw new RuntimeException (context + «должен реализовывать AdapterCalljson»); – Erf

+0

@ user7415865 Ничто в этой строке не вызывает исключение нулевого указателя. Вероятно, вы получаете «RuntimeException» по той причине, что там написано. Деятельность ** должна реализовать AdapterCalljson ** –

0

Во-первых, ваша активность, содержащий фрагмент должен реализовать этот интерфейс.

public class MainActivity implements AdapterCalljson { 

    @Override 
    void MethodCallbackjson(String jsonn) { 
     doSomethingWithJson(jsonn); 
    }  

    private void doSomethingWithJson(String json) { 

    } 

    // onCreate... 

} 

Далее я бы рекомендовал вам создать RecyclerView вне AsyncTask. Вам не нужно сохранять переменную myFragmentView.

Кроме того, вы еще не можете позвонить. Нет данных.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.maghalat, container, false); 

    // recyclerView = rootView.findViewById 
    // adapter = ... 
    // recyclerView.setAdadpter... 

    asyncRun(); // This happens in the background. There is no JSON yet 

    return rootView; 
} 

Тогда, возможно, вы должны doInBackground вернуть строку JSON, поэтому вам не нужно хранить его в качестве переменной класса.

Последний аргумент - тип возврата.

public class GetContacts extends AsyncTask<Void, Void, String> 

Таким образом, то это public String doInBackground(Void params...) {} и public void onPostExecute(String result) {}.

Другими словами, не только return null от doInBackground

@Override 
protected String doInBackground(Void... arg0) { 

    HttpHandler sh = new HttpHandler(); 

    // Making a request to url and getting response 
    jsonStr = sh.makeServiceCall(url); 

    // Parse JSON more... 

    return jsonStr; 
} 

И тогда вы должны быть в состоянии использовать свой обратный вызов.

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 

    pDialog.dismiss(); 
    if (adapterCalljson != null) { 
     adapterCalljson.MethodCallbackjson(result); 
    } else { 
     Log.w("Callback Error", "callback not assigned"); 
    } 

    // adapter.notifyDataSetChanged(); // Might want this 
} 
Смежные вопросы