2017-08-25 29 views
1

我已經通過okhttp從服務器獲取了一些Json數據,並且我想使用自定義適配器並使用自定義適配器接收以下錯誤並在 recycleview中顯示它們。如何從okhttp和Asynctask將數據放入RecyclerView

當我運行該代碼時,logcat的告訴我followeing消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 

我打印在logcat中的列表,則顯示爲空。 但我可以從IE獲得一些json數據。請問有誰能幫助我?

public class customer extends AppCompatActivity { 

private static final String TAG = "MyDebug______ " ; 
private RecyclerView cutomerRecyclerView; 
private customerAdapter mAdapter; 
private ArrayList<custModal> list; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_customer); 
    Toolbar toolbar = (Toolbar)findViewById(R.id.custom_toolbar); 
    setSupportActionBar(toolbar); 

    new getHttpData().execute(); 
    Log.d(TAG, "the list is :" +list); 
    mAdapter = new customerAdapter(this,list); 
    cutomerRecyclerView = (RecyclerView)findViewById(R.id.customer_list); 
    cutomerRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    cutomerRecyclerView.setAdapter(mAdapter); 
    cutomerRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration(){ 
     @Override 
     public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state){ 
      super.onDraw(c,parent,state); 
      c.drawColor(R.color.colorDevider); 
     } 
     @Override 
     public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 
      super.onDrawOver(c, parent, state); 
     } 
     @Override 
     public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
      super.getItemOffsets(outRect, view, parent, state); 

      outRect.offset(0,1); 
     } 
    }); 
} 


public class customerAdapter extends RecyclerView.Adapter<customerAdapter.customerViewHolder>{ 
    private Context mcontext; 
    private ArrayList<custModal> mlist; 
    // private LayoutInflater inflater; 
    class customerViewHolder extends RecyclerView.ViewHolder{ 
     private TextView name,mem,cust_id; 

     public customerViewHolder(View view){ 
      super(view); 
      cust_id = (TextView)view.findViewById(R.id.cust_id); 
      name = (TextView)view.findViewById(R.id.cust_name); 
      mem = (TextView)view.findViewById(R.id.cust_mem); 
     } 
    } 
    public customerAdapter(Context context,ArrayList<custModal> list){ 
     this.mcontext = context; 
     this.mlist = list; 
    } 
    @Override 
    public customerViewHolder onCreateViewHolder(ViewGroup parent,int viewType){ 
     customerViewHolder holder = new customerViewHolder(LayoutInflater.from(
       customer.this).inflate(R.layout.customer_item,parent,false)); 
     return holder; 
    } 
    @Override 
    public void onBindViewHolder(customerViewHolder holder,int position){ 
     holder.cust_id.setText(mlist.get(position).getId()); 
     holder.name.setText(mlist.get(position).getName()); 
     holder.mem.setText(mlist.get(position).getMobiphone()); 
    } 
    @Override 
    public int getItemCount(){ return mlist.size();} 


} 

類custModal {

private String id; 
    private String name; 
    private String gender; 
    private String mobiphone; 
    private String creat_time; 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getId() { 
     return id; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 
    public String getGender() { 
     return gender; 
    } 

    public void setMobiphone(String mobiphone) { 
     this.mobiphone = mobiphone; 
    } 
    public String getMobiphone() { 
     return mobiphone; 
    } 

    public void setCreat_time(String creat_time) { 
     this.creat_time = creat_time; 
    } 
    public String getCreat_time() { 
     return creat_time; 
    } 

} 



public class getHttpData extends AsyncTask<String,Integer,ArrayList<custModal> >{ 
    //private ArrayList<custModal> custlist; 

    @Override 

    // protected void onPreExecute(){} 

    @Override 

    protected ArrayList<custModal> doInBackground(String... params){ 
     String url = "http://aaaa.bbbbb.cn/index.php/mobi/customer/app_getlist"; 

     try{ 
      OkHttpClient client = new OkHttpClient(); 
      Request request = new Request.Builder() 
        .url(url) 
        .build(); 
      Response response = client.newCall(request).execute(); 
      String responseData = response.body().string(); 
      Log.d(TAG, "doInBackground: "+ responseData); 
      if(responseData != null){ 
       //return getCustFromJson(responseData); 
       Gson gson = new Gson(); 
       ArrayList<custModal> custlist = gson.fromJson(responseData, 
         new TypeToken<List<custModal>>() {}.getType() 
       ); 

       return custlist; 
      }else{ 
       return null; 
      } 
     }catch (IOException I){ 
      I.printStackTrace(); 
     } 

     return null; 
    } 
    @Override 

    protected void onPostExecute(ArrayList<custModal> custlist){ 
     if(!custlist.isEmpty()){ 
      super.onPostExecute(custlist); 
      list = custlist; 
      mAdapter.notifyDataSetChanged(); 
     } 
    } 

} 

}

+1

您可能是沒有打電話給你'customerAdapter()'方法,或者是傳遞一個'null'爲'list'說法。在該方法中放置一個斷點以查看發生了什麼。 – theFunkyEngineer

+0

你是否正確地得到了答覆? – DKV

+0

只有在得到結果後才需要綁定數據。 – DKV

回答

0

化妝肯定初始化適配器,適配器的數組列表和連接適配器回收站在onCreate 然後你必須添加新的yourAsyncTask()。執行你需要的http調用。 在你onBackground項目添加到數組列表和postExecute簡單地調用notify數據變化的方法

0

您的列表是空狀態,當你通過適配器構造函數傳遞,因此任何操作上的列表中返回NULL。

你可以添加一個回調到你的okhttp請求並在響應上構造適配器?不管怎樣,您需要先更新列表,然後才能對其執行任何操作。

0

我把下面的代碼添加到方法onPostExecute,它worked.But我想是不是solution.like這樣的權利:

 protected void onPostExecute(ArrayList<custModal> custlist){ 
     Log.d(TAG, "onPostExecute(Result result) called"); 
     Log.d(TAG, "onPostExecute: "+custlist); 
     mAdapter = new customerAdapter(customer.this,custlist); 
     cutomerRecyclerView = (RecyclerView)findViewById(R.id.customer_list); 
     cutomerRecyclerView.setLayoutManager(new LinearLayoutManager(customer.this)); 
     cutomerRecyclerView.setAdapter(mAdapter); 

    } 
+0

如何編寫一個通用函數來實現syncTask,可以由其他人調用?對不起,我是Android的新手。 –

+0

您是否需要調用異步任務,或者是否還會在按鈕點擊時調用異步任務? –

+0

可以通過其他方法調用。可能需要編寫一個類 –

相關問題