2

我用这个教程: https://www.youtube.com/watch?v=I2eYBtLWGzcRecyclerView的LayoutInflater修复是否正确?

https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/

起初我得到错误:

java.lang.NullPointerException: Attempt to invoke virtual method android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean)' on a null object reference 
    at pl.michalz.hideonscrollexample.adapter.parttwo.MyAdapter.onCreateViewHolder(MyAdapter.java:37) 
    at pl.michalz.hideonscrollexample.adapter.parttwo.MyAdapter.onCreateViewHolder(MyAdapter.java:18) 

,我从变化:

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Log.w("myApp", "onCreateViewHolder "); 
    View view = layoutInflater.inflate(R.layout.recycler_item, parent, false); 
    return new ViewHolder(view); 
} 

到:

View view = layoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false); 

它固定的错误,但只有几次后,我厌倦仿效应用程序。我很难完成这项工作,所以我不知道这是否是正确的解决方法,或者我的代码不好,以后可能会产生更多错误。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private LayoutInflater layoutInflater; 
    private ArrayList<Receptas> receptasL = new ArrayList<>(); 

    public MyAdapter(Context context) { 
     //layoutInflater = layoutInflater.from(context); 


    } 

    public void setReceptasList(ArrayList<Receptas> receptasL){ 
     this.receptasL = receptasL; 
     notifyItemRangeChanged(0, receptasL.size()); 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Log.w("myApp", "onCreateViewHolder "); 
     View view = layoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { 
     Receptas receptas = receptasL.get(position); 
     holder.itemTextViewPav.setText(receptas.getPav()); 
     holder.itemTextViewIngred_sk.setText(receptas.getIngred_sk()); 
    } 

    @Override 
    public int getItemCount() { 

     return receptasL == null ? 0 : receptasL.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     TextView itemTextViewPav, itemTextViewIngred_sk; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      itemTextViewPav = (TextView) itemView.findViewById(R.id.itemTextViewPav); 
      itemTextViewIngred_sk = (TextView) itemView.findViewById(R.id.itemTextViewIngred_sk); 
     } 
    } 
} 

这是片段类显示RecyclerView:

public class PartThreeFragment extends Fragment { 

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

    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); 
     requestQueue = Volley.newRequestQueue(this.getActivity()); 
     volleyJson(); 
     return view; 
    } 


    public void volleyJson() { 
     JsonObjectRequest jsObjRequest = new JsonObjectRequest 
       (Request.Method.GET, url, (String) null, new Response.Listener<JSONObject>() { 

        @Override 
        public void onResponse(JSONObject response) { 
         try { 

          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() 
         Log.w("myApp", "myAdapter.setReceptasList(receptasAList);"); 
         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); 
    } 

} 

还有主要活动类,但我不认为这是必要的。

我不知道如果其他人问这个问题,如果它不正确,但我非常感谢任何帮助。

回答

2
public MyAdapter(Context context) { 
    //layoutInflater = layoutInflater.from(context); 
} 

你在这里混合使用静态和实例方法,这是你的问题。此时,字段layoutInflater为空。然后尝试解引用它并在其上调用.from()(这是一种静态方法)。

由于layoutInflater为空(此行将分配它),因此它总是会与NullPointerException一起崩溃。

由于.from()是一个静态方法,则应该使用:

// Note the capitalization -- I'm using the LayoutInflater class to 
// reference the static method, not the layoutInflater field. 
layoutInflater = LayoutInflater.from(context); 
+0

可以初始化'layoutInflater'如'充气=(LayoutInflater)活性 \t \t \t \t .getSystemService(Context.LAYOUT_INFLATER_SERVICE); ' 其中'activity'是'Activity'或'Context'的实例 –

+0

@AmolDesai'LayoutInflater.from(context)'只是简写。它在底层做了同样的事情(请参阅源代码:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/LayoutInflater.java) – kcoppock

+0

哦,是的.. 。你是对的@kcoppock所以两者都有同样的效果:) –