2016-12-22 6 views
-2

Dieser Code funktioniert gut mit activity, aber nicht in fragment .. Anwendung Absturz, wenn dies in Fragment ausgeführt ... wenn ich getData(); unter requestQueue Anwendung laufen, aber die Daten nicht holen ..Dieser Code funktioniert gut mit Aktivität, aber nicht in Fragment

public class LatestFragment extends Fragment { 

    //Creating a List of superheroes 
    private List<SuperHero> listSuperHeroes; 

    //Creating Views 
    private RecyclerView recyclerView; 
    private RecyclerView.LayoutManager layoutManager; 
    private RecyclerView.Adapter adapter; 

    private RequestQueue requestQueue; 
    private int requestCount = 1; 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.latest, container, false); 
     recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView); 
     recyclerView.setHasFixedSize(true); 
     layoutManager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(layoutManager); 

     //Initializing our superheroes list 
     listSuperHeroes = new ArrayList<>(); 
     requestQueue = Volley.newRequestQueue(getActivity()); 

     //Calling method to get data to fetch data 
     getData(); 

     //Adding an scroll change listener to recyclerview 
     // RecyclerView.setOnScrollChangeListener(this); 

      recyclerView.addOnScrollListener(rVOnScrollListener); 

     //initializing our adapter 
     adapter = new CardAdapter(listSuperHeroes, getActivity()); 

     //Adding adapter to recyclerview 
     recyclerView.setAdapter(adapter); 
     return v; 
    } 

    //Request to get json from server we are passing an integer here 
    //This integer will used to specify the page number for the request ?page = requestcount 
    //This method would return a JsonArrayRequest that will be added to the request queue 
    private JsonArrayRequest getDataFromServer(int requestCount) { 
     //Initializing ProgressBar 
     final ProgressBar progressBar = (ProgressBar) getActivity().findViewById(R.id.progressBar1); 

     //Displaying Progressbar 
     progressBar.setVisibility(View.VISIBLE); 
    // setProgressBarIndeterminateVisibility(true); 

     //JsonArrayRequest of volley 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL + String.valueOf(requestCount), 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         //Calling method parseData to parse the json response 
         parseData(response); 
         //Hiding the progressbar 
         progressBar.setVisibility(View.GONE); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         progressBar.setVisibility(View.GONE); 
         //If an error occurs that means end of the list has reached 
         //Toast.makeText(citiesdetail.this, "No More Items Available", Toast.LENGTH_SHORT).show(); 
        } 
       }); 

     //Returning the request 
     return jsonArrayRequest; 
    } 

    //This method will get data from the web api 
    private void getData() { 
     //Adding the method to the queue by calling the method getDataFromServer 
     requestQueue.add(getDataFromServer(requestCount)); 
     //Incrementing the request counter 
     requestCount++; 
    } 

    //This method will parse json data 
    private void parseData(JSONArray array) { 
     for (int i = 0; i < array.length(); i++) { 
      //Creating the superhero object 
      SuperHero superHero = new SuperHero(); 
      JSONObject json = null; 
      try { 
       //Getting json 
       json = array.getJSONObject(i); 

       //Adding data to the superhero object 
       superHero.setImageUrl(json.getString(Config.TAG_IMAGE_URL)); 
       superHero.setName(json.getString(Config.TAG_NAME)); 
       superHero.setPublisher(json.getString(Config.TAG_PUBLISHER)); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      //Adding the superhero object to the list 
      listSuperHeroes.add(superHero); 
     } 

     //Notifying the adapter that data has been added or changed 
     adapter.notifyDataSetChanged(); 
    } 

    //This method would check that the recyclerview scroll has reached the bottom or not 
    private boolean isLastItemDisplaying(RecyclerView recyclerView) { 
     if (recyclerView.getAdapter().getItemCount() != 0) { 
      int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition(); 
      if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1) 
       return true; 
     } 
     return false; 
    } 

    //Overriden method to detect scrolling 
    private RecyclerView.OnScrollListener rVOnScrollListener = new RecyclerView.OnScrollListener(){ 
     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, 
             int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 
     } 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 

      if (isLastItemDisplaying(recyclerView)) { 
       getData(); 
      } 
     } 
    }; 
} 
+3

anzeigen Absturzprotokolle –

+0

wo i Absturzprotokolle finden, weil ich sehe, und Crash-Protokoll nicht ..in Ereignisprotokoll Fenster war ihr nicht alle Fehler zeigen –

+0

'getActivity()' ist null in 'onCreateView()' –

Antwort

2

Sie rufen getData() -Methode von onCreateView() und dem führenden parseData() -Methode und in diesem Verfahren zu nennen haben Sie „Adapter“ verwendet Objekt und Sie sind nicht initialisiert. Sie initialisieren es nach getData() -Methode in onCreateView(). Dies kann zur NullPointerException führen.

Dazu können Sie Adapter in ParseData() -Methode initialisieren und Adapter-Wert nur von dort festlegen.

+0

Können Sie mir sagen, wie ich Adapter in ParseData() -Methode initialisieren und Adapter-Wert –

+0

festlegen // Benachrichtigung des Adapters, dass Daten hinzugefügt oder geändert wurden adapter.notifyDataSetChanged(); Entfernen Sie diese Zeile von parseData() -Methode und versuchen Sie es erneut. –

1

Der Grund des Absturzes ist getActivity().findViewById().setVisibility() in getDataFromServer() Methode.

Warum erhalten Sie Fortschrittsbalken aus der Aktivitätsansicht? Wahrscheinlich ist Ihr progressBar in Fragmentsicht, so dass Ihr Code so etwas wie dies sein sollte:

public class LatestFragment extends Fragment { 
    private ProgressBar progressBar; 

    ... 

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

     ... 
     progressBar = (ProgressBar) v.findViewById(R.id.progressBar1); 
     ... 
    } 

    ... 

    private JsonArrayRequest getDataFromServer(int requestCount) { 
     // You don't need the initialization, it was done in onCreateView() in this code. Remove these lines. 
     //final ProgressBar progressBar = (ProgressBar) getActivity().findViewById(R.id.progressBar1); 

     //Displaying Progressbar 
     progressBar.setVisibility(View.VISIBLE); 
     ... 
    } 
    ... 
} 
+0

so, was ich tun soll –

+0

@SyedMuzzammilMian initialisieren progressBar in 'onCreateView()', nicht in 'getDataFromServer()', und suchen Sie in der Fragmentansicht, nicht in Aktivität. –

+0

Ja @SyedMuzzammilMian verwenden Sie nicht getActivit() -Methode, um Ihre Fragmentansicht zu initialisieren, dies kann auch zum Absturz führen. –

Verwandte Themen