2017-06-02 80 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