2

私はこのチュートリアルを使用していました: https://www.youtube.com/watch?v=I2eYBtLWGzc

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

最初はエラーが発生していました:

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);
    }

}

メインのアクティビティクラスもありますが、必要ないと思います。

この質問が正しくない場合、他にどのように質問すればよいかわかりませんが、助けていただければ幸いです。

4

1 に答える 1

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

ここで静的メソッドとインスタンスメソッドを混同しています。これが問題です。この時点で、フィールドlayoutInflaterは null です。次に、それを逆参照して呼び出しを試みます.from()(これは静的メソッドです)。

これは常にnull でクラッシュします (この行はそれを割り当てるためのものです) NullPointerExceptionlayoutInflater

は静的メソッドであるため.from()、代わりに次を使用する必要があります。

// Note the capitalization -- I'm using the LayoutInflater class to 
// reference the static method, not the layoutInflater field.
layoutInflater = LayoutInflater.from(context);
于 2016-02-26T04:15:55.327 に答える