2016-12-22 6 views
-2

Этот код отлично работает с activity, но не в fragment .. сбой приложения при его запуске во фрагменте ... когда я удаляю getData(); ниже requestQueue приложения работать, но данные не заманишь ..Этот код отлично работает с активностью, но не во фрагменте

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

Показать аварии журналы –

+0

где я найти журналы аварийных, потому что я не видит, и журнал аварии. Журнала событий окна их не было любая ошибка показывает –

+0

'getActivity()' имеет значение null в 'onCreateView()' –

ответ

2

Вы вызываете метод() из onCreateView() GetData и это приводит к вызывать метод и в этом методе parseData() вы использовали «адаптер» объект, и вы не инициализируются. Вы инициализируете его после метода getData() в onCreateView(). Таким образом, это может привести к исключению NullPointerException.

Для этого вы можете инициализировать адаптер в методе parseData() и установить для него значение адаптера.

+0

можете ли вы рассказать мне, как инициализировать адаптер в методе parseData() и установить значение адаптера –

+0

// Уведомление адаптера о том, что данные были добавлены или изменены. adapter.notifyDataSetChanged(); Удалите эту строку из метода parseData() и повторите попытку. –

1

Причиной аварии является getActivity().findViewById().setVisibility() в getDataFromServer() метод.

Почему вы получаете progressBar из вида деятельности? Возможно, ваш ProgressBar в поле зрения фрагмента, так что ваш код должен быть что-то вроде этого:

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

, так что я могу сделать –

+0

@SyedMuzzammilMian инициализирует progressBar в 'onCreateView()', а не в 'getDataFromServer()', и искать его в виде фрагмента, а не в деятельности. –

+0

Да @SyedMuzzammilMian не использует метод getActivit() для инициализации элемента управления представлением фрагмента, это также может привести к сбою. –

Смежные вопросы