2016-02-18 3 views
1

Я получаю данные новостей от своей CMS и хочу отображать их в RecyclerView. Проблема в том, что я получаю исключение нулевого указателя в строке, где я использую LinearLayoutManager. Вот вывод logcat.RecyclerView с исключением с нулевым указателем

Caused by: java.lang.NullPointerException 
    at testing.theo.manchesterunitedapp.newsandfeatures.FeaturesFragment.onCreateView(FeaturesFragment.java:65) 
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
    at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330) 
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547) 
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) 
    at android.app.Activity.performStart(Activity.java:5241) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)  
    at android.app.ActivityThread.access$800(ActivityThread.java:135)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:136)  
    at android.app.ActivityThread.main(ActivityThread.java:5001)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:515) 

Фрагмент, где я занимаюсь веб-сервисом, довольно прост. Я использую методы обратного вызова. OnCreateView, где я инициализирую ArrayList и RecyclerView, а во-вторых, onActivityCreate, где я запускаю webservice.

public class FeaturesFragment extends Fragment { 

public static final String TAG = "ManuApp"; 
private static final String IMAGE_URL = "xxxxxxxxxxxx/xxxx/features_images/" ; 
private List<FeaturesObject> listItemsList; 

private RecyclerView mRecyclerView; 
private FeaturesAdapter adapter; 

public FeaturesFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.features_row, container, false); 
    // Inflate the layout for this fragment 
    listItemsList = new ArrayList<>(); 
    mRecyclerView = (RecyclerView)v.findViewById(R.id.features_recycler_view); 
    //mRecyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity()).color(Color.BLACK).build()); 

    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 


    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    updateFeaturesList(); 
} 

public void updateFeaturesList() { 




    //declare the adapter and attach it to the recyclerview 
    adapter = new FeaturesAdapter(getActivity(), listItemsList); 
    mRecyclerView.setAdapter(adapter); 

    // Instantiate the RequestQueue. 
    RequestQueue queue = Volley.newRequestQueue(getActivity()); 



    // Request a string response from the provided URL. 
    JsonArrayRequest jsObjRequest = new JsonArrayRequest(Request.Method.GET, Config.URL_FEATURES, new Response.Listener<JSONArray>() { 

     @Override 
     public void onResponse(JSONArray response) { 

      Log.d(TAG, response.toString()); 
      //hidePD(); 

      // Parse json data. 
      // Declare the json objects that we need and then for loop through the children array. 
      // Do the json parse in a try catch block to catch the exceptions 
      try { 



       for (int i = 0; i < response.length(); i++) { 

        JSONObject post = response.getJSONObject(i); 
        FeaturesObject item = new FeaturesObject(); 
        item.setTitle(post.getString("title")); 
        item.setImage(IMAGE_URL + post.getString("features_image")); 
        item.setArticle(post.getString("article")); 



        listItemsList.add(item); 

       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      // Update list by notifying the adapter of changes 
      adapter.notifyDataSetChanged(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      //hidePD(); 
     } 
    }); 
    jsObjRequest.setRetryPolicy(new RetryPolicy() { 
     @Override 
     public int getCurrentTimeout() { 
      return 50000; 
     } 

     @Override 
     public int getCurrentRetryCount() { 
      return 50000; 
     } 

     @Override 
     public void retry(VolleyError error) throws VolleyError { 

     } 
    }); 
    queue.add(jsObjRequest); 

} 
} 

Эта часть кода вызывает проблемы.

final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
    mRecyclerView.setLayoutManager(linearLayoutManager); 

Это странно, поскольку я использую те же технологии для получения данных в другом фрагменте своего приложения.

Любые идеи?

Спасибо.

+0

Вы пытались добавить setHasFixedSize (истина) для recyclerView –

+0

я сделал только сейчас, но до сих пор у меня та же проблема: (- – Theo

+0

Какая линия бросает исключение именно – jbarat

ответ

2

Ваш RecyclerView - null. Вы уверены, что ищете правильный идентификатор в правильном файле макета? Я предполагаю, что вы раздуваете неверный файл макета, или ищете неправильный идентификатор вида для RecyclerView.

+0

Да. В этом была проблема. Я использовал неправильный XML-файл! – Theo

1

Похоже ид, что вы пытаетесь найти его не на features_row, поэтому вы получите NullPointerException на этой линии:

mRecyclerView = (RecyclerView)v.findViewById(R.id.features_recycler_view); 

Если вы продолжаете получать сообщение об ошибке вы можете попробовать это:

final FragmentActivity c = getActivity(); 
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(c); 
mRecyclerView.setLayoutManager(linearLayoutManager); 
2

Возможно, это не тот случай, но ... Как правило, вся инициализация, требующая экземпляра активности, должна быть в onActivityCreated() (или следующих методах в жизненном цикле фрагмента). Внутри onCreateView() getActivity() не гарантированно возвращает ненулевое значение. В некоторых сценариях он возвращает null.

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