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