无法访问notifyDataSetChanged

时间:2019-05-22 17:47:58

标签: android android-adapter

我有一个从SQLite数据库更新的ListView,并且设置了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;
    }

};

1 个答案:

答案 0 :(得分:0)

首先,这看起来像一个普通的Java变量范围问题,但是也存在其他问题,但是如果没有更多代码,很难分辨出来。 所以。

问题1

adapterpopulateListView的范围内定义和初始化。 该方法结束后,将删除引用,并可以通过垃圾回收删除变量存储区。

我建议您阅读https://www.java-made-easy.com/variable-scope.html

您可以通过在活动类的范围内将adapter定义为私有变量来解决此问题,然后将其提供给该类中的所有方法。

问题2

如果您已固定Problem 1,则adapter.notifyDataSetChanged();仍然不会执行任何操作。 这是因为您没有做任何更新列表时就通知ArrayList<String> listdata已更改,并且您无法更新它,因为同样没有对listdata的引用,因为它也是在本地定义的范围。

可以通过在活动范围内将listdata设为私有变量来解决此问题,但这会导致:-

问题3

这是一种非常复杂的方法,必须手动保持数据库和列表同步。

最好使用游标适配器,例如https://developer.android.com/reference/android/widget/SimpleCursorAdapter.html

位于https://github.com/codepath/android_guides/wiki/Populating-a-ListView-with-a-CursorAdapter的具有Listviews的游标适配器指南

然后在OnClick方法中,您将更新数据库,并再次获得所有结果的新游标,并将新游标替换为旧游标,然后将其替换为adapter.notifyDataSetChanged();