簡體   English   中英

Android:notifyDataSetChanged()刷新我的ListView

[英]Android: notifyDataSetChanged() to refresh my ListView

從類中獲取方法來刷新ListView時,我得到一個NullPointer異常。 我從適配器的onclick事件中的片段調用方法。 大多數事情都運行良好,我只是在輸入新項目/行后才刷新列表視圖。

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)

它拋出空指針,因為SaleAdapter未初始化。

當您調用新的Cashier()時,收銀員對象將被初始化,但Cashier類中的其他對象(如SaleAdapter)將在執行load_sales()方法后初始化

所以最大的錯誤是你不應該在你的ProductAdapter中使用新的Cashier()。 將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
            }
        }
    }
}

並通過從Cashier類調用新的ProductAdapter(this)從您的片段Cashier傳遞出納對象

您已在load_sales()方法中初始化適配器,因此首次必須在調用refreshlist方法之后調用load_sales方法

你在代碼中做錯了什么是Cashier cashier = new Cashier(); 這條線

當你使用新的關鍵字意味着你創建新的對象,所以在這里你創建了Cashier Fragment的新對象,當你調用刷新方法時,你的適配器為null時沒有視圖(當你提交事務時查看加載)

你要做什么

Prasanna Anbu給出了完美的答案我只是添加了你忘了什么

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM