簡體   English   中英

無法訪問notifyDataSetChanged

[英]Can't access notifyDataSetChanged

我有一個ListView,我從我的SQLite數據庫更新,我已經設置了一個onItemLongClickListener來幫助我通過對話框界面從我的數據庫中刪除。 但是,即使我使我的適配器全局化,我似乎也無法訪問notifyDataSetChanges。

這是我的列表填充函數

private void populateListView() {
    Cursor data = mDatabaseHelper.getData();
    ArrayList<String> listdata = new ArrayList<>();
    while (data.moveToNext()) {
       last_date = expire_Date(data.getString(4));
        Calendar c = Calendar.getInstance();
        c.setTime(last_date);
        c.add(Calendar.DATE, 30);
        Date currDate = new Date();
        SimpleDateFormat dates = new SimpleDateFormat("M/d/yyyy");
        currDate.setTime(System.currentTimeMillis());
        int differenceDates;
        differenceDates = difOfDay(c, currDate);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        month = month+1;
        String date = month + "/" + day + "/" + year;
        String first_row =data.getString(3) + " (" + data.getString(1) + ")\n";
        String second_row = getResources().getString(R.string.red_info);

        listdata.add(first_row + " " + second_row + differenceDates + " (" + date + ")");
    }
    ListAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,listdata);
    mListView.setAdapter(adapter);
}

這是我的刪除功能:

public AdapterView.OnItemLongClickListener myClickListener = new AdapterView.OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view,final int position, final long id) {
        AlertDialog alert = new AlertDialog.Builder(view.getContext())
                .setTitle("Delete ")
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                        mDatabaseHelper.deletechute(position);

                        Toast.makeText(getApplicationContext(), "Parachute deleted", Toast.LENGTH_LONG).show();
                        adapter.notifyDataSetChanged(); ////Here my code can't resolve my adapter///
                        dialog.dismiss();
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.cancel();
                    }
                }).show();
        return false;
    }

};

這首先看起來像一個簡單的Java變量范圍問題,但也有其他問題,但沒有更多的代碼很難說。 所以。

問題1

adapterpopulateListView的范圍內定義和初始化。 當此方法結束時,將刪除引用,並且可以通過垃圾回收刪除變量存儲區域。

我建議你閱讀https://www.java-made-easy.com/variable-scope.html

您可以通過將adapter定義為Activity類范圍內的私有變量來解決此問題,然后它將可用於類中的所有方法。

問題2

如果您已修復Problem 1那么adapter.notifyDataSetChanged(); 仍然不會做任何事情。 這是因為當您沒有做任何事情來更新List並且無法更新它時,您通知它ArrayList<String> listdata已更改,因為再次沒有可用的listdata引用,因為它也在本地范圍中定義。

這可以通過使listdata成為您的Activity范圍內的私有變量來修復,但這會導致: -

問題3

這是一種非常復雜的方法,必須手動保持數據庫和列表同步。

使用光標適配器會更好,例如https://developer.android.com/reference/android/widget/SimpleCursorAdapter.html

有關Listviews的游標適配器指南,請訪問https://github.com/codepath/android_guides/wiki/Populating-a-ListView-with-a-CursorAdapter

然后在OnClick方法中,您將更新數據庫,並再次獲取所有結果的新Cursor,並將舊Cursor交換為舊的,然后是adapter.notifyDataSetChanged();

暫無
暫無

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

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