Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ListView未刷新数据库中的内容_Java_Android - Fatal编程技术网

Java ListView未刷新数据库中的内容

Java ListView未刷新数据库中的内容,java,android,Java,Android,我正在尝试制作一个简单的列表,能够添加新项目,删除和修改它们。列表的内容应保存在SQLite中。我的问题是:当我添加一个新项目时,列表不会刷新,只有在我退出应用程序并再次打开它后,该项目才会出现。我找到了一个解决方法,但它很粗糙,不能完全工作 public class MainActivity extends AppCompatActivity { SaveClass save = new SaveClass(this); private ListView mShoppingLi

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

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();
            }
        });
public类MainActivity扩展了AppCompatActivity{
SaveClass save=新的SaveClass(此);
私有ListView mShoppingList;
私人编辑;
私人按钮;
private ArrayAdapterElem mAdapter;
列名elemek;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
elemek=save.getAllItems();
mAdapter=新的ArrayAdapterElem(这个,elemek);
mShoppingList=findviewbyd(R.id.shopping\u listView);
mItemEdit=(EditText)findViewById(R.id.item_EditText);
mAddButton=(按钮)findViewById(R.id.add_按钮);
mShoppingList.setAdapter(mAdapter);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
ItemList item=newitemlist(mitedit.getText().toString());
mItemEdit.setText(“”);
保存附录(项目);
mAdapter.添加(项目);
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;
    }

}

公共类ArrayAdapterElem扩展了ArrayAdapter{
私人内部要素;
公共ArrayAdapterElem(上下文上下文,列表elemek){
超级(上下文,0,elemek);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ItemList elem=getItem(位置);
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(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(颜色为灰色);
elemnev.setPaintFlags(elemnev.getPaintFlags()| Paint.STRIKE_-THRU_-TEXT_-FLAG);
}
其他的
{
elemnev.setTextColor(Color.BLACK);
elemnev.setPaintFlags(elemnev.getPaintFlags()&(~Paint.STRIKE_-THRU_-TEXT_-FLAG));
}
elemnev.setText(elem.listaElem);
返回视图;
}
}
现在我将项目保存在SQLite中,并手动将项目添加到ListView。我知道这意味着数据库中的新对象和列表中的对象不相同,因此我的修改不会对保存的项目起作用,直到我重新加载应用程序以从数据库中获取对象。因此我想找到更好的解决方案。 如果我只是将项目保存在数据库中,并在适配器上调用notifyDataSetChanged()方法,它不会从数据库刷新列表中的项目。我应该在自定义ArrayAdapter类中实现notifyDataSetChanged,还是有更简单的解决方案我看不到


感谢您在adavance中提供的任何帮助。

我认为您在将数据保存到SaveClass对象时没有更新附加数据列表。请尝试下面的方法。如果我的理解正确,它可能会起作用

编辑mAddButton click listener,如下所述

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); // this line might not required.
                elemek.add(item);
                mAdapter.notifyDataSetChanged();
            }
        });

您可以像这样达到同样的效果
在适配器类中创建如下方法

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

参考此网站…这可能有助于您。`````不要将项目添加到listview中,而是从数据库手动填充它。它与我的解决方案几乎相同。它手动将对象添加到列表中。我希望在每次onClick事件时从数据库更新列表。它与我的解决方案没有什么不同,因为它将对象添加到列表中,而不是从数据库更新列表。是的,它与您的不同,因为在您的情况下,您没有将更新的列表传递给Adapter。我理解这一点,但我想从数据库更新列表,但它没有这样做。它仍然不起作用。我不知道为什么,但列表没有使用新添加的项刷新。我确实找到了一个黑客如果我在适配器上调用clear()方法,然后以数据库的内容作为参数调用addAll()方法,那么新项在创建时就会出现。
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());

        }
    });