首页 > 解决方案 > ListView 不刷新数据库中的内容

问题描述

我正在尝试制作一个简单的列表,能够向其中添加新项目、删除和修改它们。列表的内容应该保存在 SQLite 中。我的问题如下:当我添加一个新项目时,列表没有刷新,并且该项目只有在我退出应用程序后才会出现,然后再次打开它。我找到了一个解决方法,但它很hacky并且不能完全工作.

public class MainActivity extends AppCompatActivity {
    SaveClass save = new SaveClass(this);
    private ListView mShoppingList;
    private EditText mItemEdit;
    private Button mAddButton;
    private ArrayAdapterElem mAdapter;
    List<ItemList> elemek;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        elemek = save.getAllItems();

        mAdapter = new ArrayAdapterElem(this, elemek);
        mShoppingList = findViewById(R.id.shopping_listView);
        mItemEdit = (EditText) findViewById(R.id.item_editText);
        mAddButton = (Button) findViewById(R.id.add_button);
        mShoppingList.setAdapter(mAdapter);


        mAddButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ItemList item = new ItemList(mItemEdit.getText().toString());
                mItemEdit.setText("");
                save.addElem(item);
                mAdapter.add(item);
                mAdapter.notifyDataSetChanged();
            }
        });

这是我的自定义 ArrayAdapter 类:

public class ArrayAdapterElem extends ArrayAdapter<ItemList> {

    private int elem;

    public ArrayAdapterElem(Context context, List<ItemList> elemek) {
        super(context, 0, elemek);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ItemList elem = getItem(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.lista_elem, parent, false);
        }
        TextView elemnev = (TextView) convertView.findViewById(R.id.Elem);

        if (elem.checked == true) {
            elemnev = (TextView) convertView.findViewById(R.id.Elem);
            elemnev.setTextColor(Color.GRAY);
            elemnev.setPaintFlags(elemnev.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        }
        else
        {
            elemnev.setTextColor(Color.BLACK);
            elemnev.setPaintFlags(elemnev.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
        }

        elemnev.setText(elem.listaElem);

        return convertView;
    }

}

现在我将项目保存在 SQLite 中并手动将项目添加到 ListView。我知道这意味着数据库中的新对象和列表中的对象不一样,因此我的修改不适用于保存的项目,直到我重新加载应用程序以从数据库中获取对象。所以我想为此找到一个更好的解决方案。如果我只是简单地将项目保存在数据库中,并在适配器上调用 notifyDataSetChanged() 方法,它不会从数据库中刷新列表中的项目。我应该在我的自定义 ArrayAdapter 类中实现 notifyDataSetChanged,还是有一些我看不到的更简单的解决方案?

感谢您提前提供的任何帮助。

标签: javaandroid

解决方案


您可以像这样
在适配器类中实现相同的方法

public class ArrayAdapterElem extends ArrayAdapter<ItemList> {
    private int elem;
   private List<ItemList>arraylist;

    public ArrayAdapterElem(Context context, List<ItemList> elemek) {
        super(context, 0, elemek);
    }
    public void updateList(List<ItemList> list){
         this.arraylist = list;
         notifyDataSetChanged();
       }

在你的 onclick 监听器中

mAddButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ItemList item = new ItemList(mItemEdit.getText().toString());
            mItemEdit.setText("");
            save.addElem(item);

            adapter.updateList(save.getAllItems());

        }
    });

推荐阅读