Android-RecyclerView NullPointerException getItemCount吗? [英] Android - RecyclerView NullPointerException getItemCount?

查看:61
本文介绍了Android-RecyclerView NullPointerException getItemCount吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个recyclerView,它使我崩溃了:

I have a recyclerView that it get me crash :

这是我的StartActivity:

Here is my StartActivity :

public class StartActivity extends AppCompatActivity {

    TextView txtTest;
    private ProgressDialog pDialog;
    // These tags will be used to cancel the requests
    private String tag_json_obj = "jobj_req", tag_json_arry = "jarray_req";

    private RecyclerView.Adapter mAdapter;
    RecyclerView UserCode_Recycler;
    private LinearLayoutManager mLayoutManager;


    List<Marketing_Code> userCodeList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        txtTest = (TextView) findViewById(R.id.txtTest);
        UserCode_Recycler = (RecyclerView) findViewById(R.id.UserCode_Recycler);
        pDialog = new ProgressDialog(this);
        pDialog.setMessage("Loading...");
        pDialog.setCancelable(false);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        if (fab != null) {
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                }
            });
        }

        makeJsonArryReq();

        userCodeList = new ArrayList<>();
        // create an Object for Adapter
        mAdapter = new UserCodeList_Adapter(userCodeList, StartActivity.this);
        // set the adapter object to the Recyclerview
        UserCode_Recycler.setAdapter(mAdapter);

        mAdapter.notifyDataSetChanged();


        UserCode_Recycler.setHasFixedSize(true);

        mLayoutManager = new LinearLayoutManager(this);
        // use a linear layout manager
        UserCode_Recycler.setLayoutManager(mLayoutManager);

    }

    private void showProgressDialog() {
        if (!pDialog.isShowing())
            pDialog.show();
    }

    private void hideProgressDialog() {
        if (pDialog.isShowing())
            pDialog.hide();
    }


    /**
     * Making json array request
     */
    private void makeJsonArryReq() {
        showProgressDialog();
        JsonArrayRequest req = new JsonArrayRequest(Const.Marketing_List,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("MYData", response.toString());
                        userCodeList = MarketingCode_JSONParser.parseFeed(response.toString());
                       /* // create an Object for Adapter
                        mAdapter = new UserCodeList_Adapter(userCodeList, StartActivity.this);
                        // set the adapter object to the Recyclerview
                        Search_Recycler.setAdapter(mAdapter);
                        mAdapter.notifyDataSetChanged();
                        //txtTest.setText(response.toString());*/
                        mAdapter.notifyDataSetChanged();
                        hideProgressDialog();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d("Custom Log Error", "Error: " + error.getMessage());
                hideProgressDialog();
            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(req, tag_json_arry);
        // Cancelling request
        // ApplicationController.getInstance().getRequestQueue().cancelAll(tag_json_arry);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

还有我的适配器:

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

    private List<Marketing_Code> ucList;
    public static Activity activity;
    public UserCodeList_Adapter(List<Marketing_Code> userCodeList, Activity activity) {
        this.ucList = userCodeList;
        this.activity = activity;
    }
    @Override
    public UserCodeList_Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listmarketing_cardview, null);

        // create ViewHolder
        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(UserCodeList_Adapter.ViewHolder viewHolder, int position) {
        String userCode =String.valueOf(ucList.get(position).getMarketCode());
        viewHolder.txtUserID.setText(userCode);
    }

    @Override
    public int getItemCount() {
        return ucList.size();
        //return ucList == null ? 0 : ucList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView txtUserID;

        public Marketing_Code items;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);

            txtUserID = (TextView) itemLayoutView.findViewById(R.id.txtUserID);
            // Onclick event for the row to show the data in toast
            itemLayoutView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                }
            });

        }

    }
}

推荐答案

您尚未初始化userCodeList.

看到您的代码,您将适配器基于该列表,而该列表尚未初始化.因此,当适配器尝试了解列表中有多少项时,它会抛出NullPointerException.

Seeing your code, you based your adapter to that list while it is not yet initialized. Consequently, when the adapter tried to learn how much item your list have it throws a NullPointerException.

将您的userCodeList声明更改为如下所示:

Change your declaration of userCodeList to one like below:

List<Marketing_Code> userCodeList = new ArrayList<>();


看到更新的问题,您似乎是根据JSON响应建立数据的.如果是这种情况,那么您目前正在做什么几乎是正确的.


Seeing your updated question, you seem to base your data from a JSON response. If that's the case, what you're currently doing is almost correct.

观察您的代码的这段经过稍微修改的片段:

Observe this slightly modified snippet of your code:

private void makeJsonArryReq() {
    showProgressDialog();
    JsonArrayRequest req = new JsonArrayRequest(Const.Marketing_List,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d("MYData", response.toString());
                    /* YOUR OLD CODE -> */ // userCodeList = MarketingCode_JSONParser.parseFeed(response.toString());
                    /* HOW IT SHOULD'VE BEEN */ userCodeList.addAll(MarketingCode_JSONParser.parseFeed(response.toString()));
                    mAdapter.notifyDataSetChanged();
                    hideProgressDialog();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("Custom Log Error", "Error: " + error.getMessage());
            hideProgressDialog();
        }
    });

// ...

请查看以上代码段中的注释部分.这样做应该可以解决您的问题,并使数据在屏幕上可见.

Look at the commented part of the above snippet. Doing so should solve your problem and make the data visible on screen.

这篇关于Android-RecyclerView NullPointerException getItemCount吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆