2017-09-01 276 views
0

我一直在努力recyclerView但是當我運行我的應用程序它沒有顯示在活動和應用程序崩潰的任何數據,並給出該方法空指針異常

這裏的錯誤是我的適配器類:

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


private ArrayList<info> Info=new ArrayList<>(); 

public Adaptor(ArrayList<info> info) { 
    this.Info = info; 
} 


public void updateList(ArrayList<info> data) { 
    Info = data; 
    notifyDataSetChanged(); 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 


    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.list_view, parent, false); 

     return new ViewHolder(itemView); 


} 



@Override 
public void onBindViewHolder(ViewHolder holder, int position) 
{ 

    info i= Info.get(position); 
    holder.name.setText(i.getName()); 
    holder.city.setText(i.getCity()); 
    holder.city.setText(i.getUniversity()); 


} 



public class ViewHolder extends RecyclerView.ViewHolder { 

    TextView name, city, uni; 


    public ViewHolder(final View v) { 
     super(v); 
     name = (TextView) v.findViewById(R.id.name); 
     city = (TextView) v.findViewById(R.id.city); 
     uni = (TextView) v.findViewById(R.id.university); 

    } 




} 

public int getItemCount() { 
    return Info.size(); 
} 

}

這裏是我的活動類:

public class Home extends AppCompatActivity implements HomeCallBack { 

    public ArrayList<info> Info; 
    private Adaptor myadaptor; 
private RecyclerView recyclerView; 
private RecyclerView.LayoutManager layoutManager; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    recyclerView=(RecyclerView)findViewById(R.id.recycle_view); 
     Info=new ArrayList<>(); 

    myadaptor=new Adaptor(Info); 
    recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); 
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(mLayoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.setAdapter(myadaptor); 



    BackgroundHome backgroundHome=new BackgroundHome(this,this); 
    backgroundHome.execute(); 


} 

@Override 
public void processData(JSONArray data) 
{ 

    JSONObject js; 

      if(data!=null) 
      { 
       Info=new ArrayList<>(); 


       try 
       { 
        for(int i=0;i<data.length();i++) 
        { 
         js =data.getJSONObject(i); 
         info in=new 


    info(js.getString("Names"),js.getString("city"), 
    js.getString("university")); 
         Info.add(in); 

        } 


        myadaptor=new Adaptor(Info); 

        recyclerView.setAdapter(myadaptor); 

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

       myadaptor.updateList(Info); 


       } 

每當我運行它,它崩潰和getItemcount()方法中發生錯誤,它是null,但我已初始化它爲Info.size();

+0

不初始化您的信息的ArrayList在你的適配器類別.... 從適配器類刪除此....只是寫的ArrayList 信息; 不需要初始化它。初始化將在活動中完成。 – Sahil

+0

我們需要找到您的問題的單條信息是堆棧跟蹤。請不要在這裏包含你的整個程序的代碼。 *只顯示我們的堆棧跟蹤*。 https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it/218510#218510 –

+0

可能重複[什麼是NullPointerException,以及如何修復它?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

回答

0

在您的processData函數中,您將創建一個Info列表,並向其中添加新項目。這很好。

但是,在此之後,您將創建一個具有該Info列表的新適配器,然後您再次使用Info列表設置該適配器。

myadaptor =new Adaptor(Info); 
recyclerView.setAdapter(myadaptor); 

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

myadaptor.updateList(Info); 

也許這就是導致它變爲空的問題。

+0

他不需要這些行是的,但我不認爲那就是問題所在。 如果你考慮一下他所做的事情,他會將新的適配器對象設置爲他的回收視圖。只是對象不再變化......然後他在這行'myadaptor.updateList(Info)'中設置了他在其中創建的列表,並且這也沒有問題 –

+0

是啊......幾乎不可能說出什麼是錯誤的窩/棧跟蹤... –

0

okey ..我檢查了你的代碼。對我來說,這個例外沒有明顯的原因,但無論如何,讓我們修復和調試一些問題。

任何東西之前,請更改名稱的對象,你/班...

/// you have class with name 'info' 
private ArrayList<info> Info=new ArrayList<>(); 
// here you set variable with the same class name !!! 
public Adaptor(ArrayList<info> info) { 
    this.Info = info; 
} 

和測試程序,如果問題仍然 然後讓使用測試項目。

首先,在您的適配器替換該行private ArrayList<info> Info=new ArrayList<>();private ArrayList<info> Info= null;。然後讓我們調試代碼..

首先設置這些行作爲註釋BackgroundHome backgroundHome=new BackgroundHome(this,this); backgroundHome.execute();後運行程序..主要是你的程序將運行沒有錯誤..如果這發生那麼你的錯誤在processData(JSONArray data)

然後讓我們檢查你的代碼並修改它。 你不需要這些線。

myadaptor=new Adaptor(Info); // delete 

recyclerView.setAdapter(myadaptor);// delete 

現在運行您的程序..

+0

我的動機是不運行應用程序沒有崩潰,但也顯示活動的數據.. –

+0

我完成了所有你告訴我,應用程序正在運行,但沒有顯示任何東西! ! –

+0

okey .. null錯誤消失!!!我期望這個結果沒有問題,我可以告訴你什麼是下一步,但首先我需要你做一些事情...設置日誌下面'myadaptor.updateList(信息);'和在這個日誌顯示大小,如果信息列表。還要在返回之前設置登錄'getItemCount()'並檢查信息列表的大小並告訴我結果 –