2017-06-02 38 views
1

從類中獲取方法來刷新我的ListView時,出現NullPointer異常。我正在調用適配器的onclick事件中的片段的方法。大多數情況下,每件事情都很好,我只是在輸入新項目/行後不能刷新列表視圖。Android:notifyDataSetChanged()刷新我的ListView

public class Cashier extends Fragment { 
    public SaleAdapter saleAdapter; 
    List<SaleModel> saleModelList = new ArrayList<>() 

    public view onCreateView(...) { 
     load_sales(); 
    } 

    public void load_sales() { 
     saleModelList.clear(); 
     SQLiteHelper db = new SQLiteHelper(getActivity()); 
     Cursor cursor = db.showSales(); 
     if(cursor.moveToFirst()) { 
      do { 
       SaleModel saleModel = new SaleModel(   
cursor.getString(cursor.getColumnIndex(SQLiteHelper.COL_PCODE)), 
cursor.getString(cursor.getColumnIndex(SQLiteHelper.COL_QUANTITY)), 
cursor.getString(cursor.getColumnIndex(SQLiteHelper.COL_SRP)), 
cursor.getString(cursor.getColumnIndex(SQLiteHelper.COL_TOTALPRICE)) 
       ); 
       saleModelList.add(saleModel); 
      } while(cursor.moveToNext()); 
     } 
    saleAdapter = new SaleAdapter(getActivity(), R.layout.list_sale, saleModelList); 
    lvSales.setAdapter(saleAdapter); 
    saleAdapter.notifyDataSetChanged(); 
    } 

    public void refreshList() { 
     saleAdapter.notifyDataSetChanged(); 
    } 
} 

從適配器我必須調用load_sales()方法。

public class ProductAdapter extends RecycleView.Adapter .... { 
    private List<ProductModel> productModelList = new ArrayList<>(); 
    private Context context; 

    public ProductAdapter (Context context, List<ProductModel> productModelList) { 
     this.context = context; 
     this.productModelList = productModelList; 
    } 

    class HolderData extends RecycleView.ViewHolder { 
     ... 
     view.OnClickListener(....) { 
      AlertDialog.Builder builder = .... 
      builder.setPositiveButton() { 
       Cashier cashier = new Cashier(); //Declare cashier as new Cashier class 
       cashier.refreshList(); //Uses the refreshList() to reload the ListView 
      } 
     } 
    } 
} 

這裏是我的錯誤

java.lang.NullPointerException 
    at xxxx.fragment.Cashier.refershList(Cashier.java:112) 
    at xxxx.utility.adapter.ProductAdapter$HolderData$1$1.onClick(ProductAdapter.java:121) 
    at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161) 

回答

0

它拋出空指針,因爲SaleAdapter將不會被初始化。

當你調用新的出納()收銀員對象將被初始化,但LOAD_SALES後一個像SaleAdapter出納類的其他對象將初始化()被執行

方法

所以最大的錯誤是你不應該做新收銀員()在您的ProductAdapter中。傳SaleAdapter片段ProductAdapter

public class ProductAdapter extends RecycleView.Adapter .... { 
    Cashier mCashier; 
    public ProductAdapter(Cashier cashier){mCashier = cashier} 
    .... 
    class HolderData extends RecycleView.ViewHolder { 
     ... 
     view.OnClickListener(....) { 
      AlertDialog.Builder builder = .... 
      builder.setPositiveButton() { 

       mCashier.refreshList(); //Uses the refreshList() to reload the ListView 
      } 
     } 
    } 
} 

,並從出納類

+0

我用我在其他情況下ProductAdapter,會有一個第三個參數,然後... – Maki

+0

公衆ProductAdapter(上下文的背景下,名單<產品型號> productModelList,Cashier出納員)this.context = context; this.productModelList = productModelList; this.cashier = cashier; } – Maki

+0

我不是在我的SaleAdapter @ _ @ – Maki

0

你必須在LOAD_SALES初始化適配()方法,因此調用 新ProductAdapter(本)通過從片段出納出納對象第一次你有電話refreshlist方法

+0

這就是現在發生的事情......在加載後調用刷新 – Maki

0

你沒看錯的代碼是什麼出納出納=新 出納()之後調用LOAD_SALES方法;此行

當您使用 關鍵字意味着你創建新的對象,因此在這裏你創建出納片段的新對象(當你提交事務看法負荷)是沒有必須查看當你在這個時間打電話刷新方法

您的適配器是空

,你所要做的

人員Prasanna庵埠給出完美的答案我只是添加了什麼喜忘記

public class ProductAdapter extends RecycleView.Adapter .... { 
    Cashier mCashier; 
    ArrayList<ProductDetails> mProductList 
    public ProductAdapter(Cashier cashier,ArrayList<ProductDetails> productList){ 
     mCashier = cashier; 
     mProductList = productList ; 
    } 
    .... 
    class HolderData extends RecycleView.ViewHolder { 
     ... 
     view.OnClickListener(....) { 
      AlertDialog.Builder builder = .... 
      builder.setPositiveButton() { 

       methodToAddDataInDatabase(); 
       cashier.load_sales(); // this method call when you want to load new instance of adapter 
       //ArrayList<ProductDetails> myObject = new ArrayList<ProductDetails>(mProductList); 
      // Refresh(myObject); 
      } 
     } 
    } 

public void Refresh(ArrayList<ProductDetails> productList) { 
     mProductList .clear(); 
     mProductList .addAll(productList); 
     notifyDataSetChanged(); 
    } 
} 

這是如何裝入適配器

ProductAdapter mProductAdapter = new ProductAdapter (this, mProductList); 
recyclerView.setAdapter(mProductAdapter); 
+0

我會將Cashier作爲ProductAdapter的上下文傳遞?因爲現在即時通過上下文上下文... public ProductAdapter(上下文上下文,List productModelList)this.context = context; this.productModelList = productModelList; } – Maki

+0

BTW,ProductAdapter = RecycleView而SaleAdapter =的ListView – Maki

+0

我想顯示所有的代碼買stackoferflow wount讓我=( – Maki