在Android Studio中删除项目后无法刷新列表视图

时间:2016-12-27 18:54:24

标签: android listview android-cardview

删除或编辑一个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。它编辑和删除完全正常,但它不刷新信息。

2 个答案:

答案 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中删除项目时,它不会更新您的列表,因为您的适配器保存在列表之前传递的数据。