删除或编辑一个cardview后,我在列表视图中刷新卡片视图时遇到问题,我尝试使用$delete_foo = $bdd->prepare("DELETE FROM table WHERE id = :id");
$delete_foo->execute(array(
"id" => $table_id
));
$delete_foo = $delete_foo->fetch(PDO::FETCH_ASSOC);
echo $delete_foo['name'] . " has been deleted !";
但无效。我是Android Studio的新手。
这是我的代码:
RegistroActivity
.notifyDataSetChanged()
}
我使用简单的select * from从模型中填充数据,然后将数据发送到适配器。这是我的适配器:
public class RegistroActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private List<Registro> items = new ArrayList<>();
private RegistroAdapter registroAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registro);
RegistroModel registroModel = new RegistroModel();
Cursor query = registroModel.showReg(HomeActivity.database);
if (query.moveToFirst()) {
do {
Registro expense = new Registro(query.getInt(0), query.getString(1), query.getFloat(2), query.getFloat(3), query.getString(4), query.getString(5) );
items.add(expense);
} while (query.moveToNext());
}
recyclerView = (RecyclerView) findViewById(R.id.recycler);
recyclerView.setHasFixedSize(true);
recyclerView.setPadding(8, 8, 8, 8);
recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2));
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new RegistroAdapter(items);
recyclerView.setAdapter(adapter);
}
}
我在卡片视图中的元素中设置数据,此卡片视图有两个图像按钮,用于删除和编辑卡片视图中的每个项目。我为它们设置了onClickListener。它编辑和删除完全正常,但它不刷新信息。
答案 0 :(得分:1)
原因是您在SQLite数据库上进行了任何更改,而不是在适配器的items
列表中。适配器仅适用于在RegistroActivity
中初始化数据集时传递给它的数据集。因此,当您想要更改某些内容时,需要更改SQLite以永久存储修改并刷新适配器中的数据集以允许用户查看更改。
在您的情况下,请尝试添加下面给出的三行代码:
viewHolder.delete_expense.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
int pos = items.get(i).getId();
try{
SQLiteDatabase conn = HomeActivity.database.getWritableDatabase();
int n = conn.delete("registro","id="+pos, null);
items.remove(i);
notifyItemRemoved(i);
notifyItemRangeChanged(i, item.size());
if (n == 1){
Toast.makeText(v.getContext(), v.getContext().getString(R.string.mensajeEliminarexito), Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(v.getContext(),v.getContext().getString(R.string.mensajeErrorEliminar) , Toast.LENGTH_SHORT).show();
}
}catch (Exception e){
Toast.makeText(v.getContext(), "Error. ID=" + e.toString(), Toast.LENGTH_SHORT).show();
}
}
});
答案 1 :(得分:0)
在通知之前,只需从适配器中删除您的项目,例如
items.remove(i);
当您从db中删除项目时,它不会更新您的列表,因为您的适配器保存在列表之前传递的数据。