2016-08-02 19 views
0

Ich habe einen recyclerView, dass es mir Absturz erhalten:Android - RecyclerView NullPointerException getItemCount?

enter image description here

Hier mein StartActivity ist:

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

Und mein Adapter:

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

     } 

    } 
} 

Antwort

3

Sie haben nicht initialisiert Ihre userCodeList.

Nachdem Sie Ihren Code gesehen haben, haben Sie Ihren Adapter auf diese Liste gesetzt, obwohl er noch nicht initialisiert wurde. Folglich, wenn der Adapter versucht zu erfahren, wie viel Artikel Ihre Liste haben, wirft es eine NullPointerException.

ändern Erklärung userCodeList einem wie unten:

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

Ihre aktualisierte Frage sehen, scheinen Sie Ihre Daten aus einer JSON-Antwort zu stützen. Wenn das der Fall ist, was Sie gerade tun, ist fast korrekt.

Beachten Sie diese leicht modifizierte Snippet 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(); 
     } 
    }); 

// ... 

Blick auf die kommentierten Teil des obigen Schnipsel. Dies sollte Ihr Problem lösen und die Daten auf dem Bildschirm sichtbar machen.

+0

Versteh mich nicht jeden Absturz jetzt, aber meine Liste ist noch leer? –

+0

Ist das wahr? Zeichenfolge userCode = String.valueOf (ucList.get (position) .getMarketCode()); –

+0

Nun, es ist ..Sie sollten diese "Liste" später im Prozess füllen. Rufen Sie einfach 'adapter.notifyDataSetChaged()' auf, sobald Sie dies tun, und Sie sollten Ihre Artikel auf dem Bildschirm sehen. – ridsatrio

1

zwei Möglichkeiten, dies zu handhaben:

  1. Sie müssen überprüfen, ob die Liste, bevor Sie das NULL ist seine Größe

    public int getItemCount() { 
        if(ucList == null) 
         return 0; 
        return ucList.size(); 
    } 
    
  2. Alternativ zu überprüfen, und dies ist der empfohlene Ansatz zu Diese Angelegenheit, ist es zu einer leeren Liste am Anfang zu initialisieren oder stellen Sie sicher, dass es immer initialisiert wird, bevor es vom zugeordneten Adapter zugegriffen wird.

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

Hoffnung, das hilft.

+0

Der erste Weg könnte funktionieren. Aber es gibt keine Garantie, dass es die durch die "Null" -Liste verursachten Folgeschäden stoppt. Adapter verlassen sich stark auf ihre "Liste", so dass sie niemals "null" sein sollte. – ridsatrio

+0

Zustimmen. Der Antwortpunkt 2 wurde aktualisiert, um den empfohlenen Ansatz über die Initialisierung vor dem Zugriff anzugeben – akdsouza

0

Ich denke, Sie müssen replaceAll Funktion für die Liste verwenden, anstatt direkt gleichzusetzen. Hier

userCodeList = MarketingCode_JSONParser.parseFeed(response.toString()); 

Versuchen zu überprüfen, ob userCodeList alle Daten enthält, bevor Sie den Adapter initialzing.

0

Bitte folgendes tun und versuchen

// create an Object for Adapter   
    userCodeList = new ArrayList<>(); 
    mAdapter = new UserCodeList_Adapter(userCodeList, StartActivity.this);