Android - 如何在从数据库中添加/删除项目后动态刷新 ListView

标签 android listview

我是 Android 新手。我遇到与所述相同的问题 here ...我正在尝试在 Android 应用程序中管理一个简单的列表。列表的内容保存在 SQLite 数据库中。当用户选择并按住特定行时,会出现一个上下文菜单,其中包含“打开/删除”选项。当他们选择“删除”时,该行将从数据库中删除,但 View 不会刷新。当我退出应用程序并返回时,相应的行已被删除。所以,我知道该行已被删除,只是 ListView 没有刷新。与向数据库添加新项目相同。我搜索了解决方案,但尚未找到。感谢任何帮助。

Activity 类:

 public class ProjectsActivity extends Activity {

private RMProject rmProject = null;
private RMProjectDBHelper projectDBHelper = null;
ArrayAdapter<String> adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    rmProject = new RMProject();
    projectDBHelper = new RMProjectDBHelper(this);

    final ListView lv = (ListView) findViewById(R.id.list);

    adapter = new ArrayAdapter<>(this, R.layout.list_item, getProjectNames());
    adapter.notifyDataSetChanged();
    lv.setAdapter(adapter);

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
            AlertDialog.Builder  builder = new AlertDialog.Builder(ProjectsActivity.this);
            builder.setTitle("What to do with project?");
            builder.setPositiveButton("Open", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                    Intent intent = new Intent(ProjectsActivity.this, OpenProjectActivity.class);
                    //todo: send project information as parameter
                    startActivity(intent);
                }
            });
            //**!!!Here I delete project item from database!!!**
            builder.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String selected = ((TextView) view.findViewById(R.id.list_textView)).getText().toString();
                    int projId = projectDBHelper.findIdByName(selected);
                    projectDBHelper.deleteProject(projId);
                    Toast toast=Toast.makeText(getApplicationContext(), "Project "+selected+" deleted", Toast.LENGTH_SHORT);
                    toast.show();
                    //**call getProjectNames and notifydataSetChanged**
                    getProjectNames();
                    adapter.notifyDataSetChanged();
                }
            });
            builder.show();
        }
    });

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {


    if (item.getItemId() == R.id.menu_item) {
        final Dialog dialog = new Dialog(ProjectsActivity.this);
        dialog.setContentView(R.layout.add_proj);
        dialog.setTitle("Введите название проекта:");
        dialog.setCancelable(false);

        Button okBtn = (Button) dialog.findViewById(R.id.btn_create_proj);
        Button cancelBtn = (Button) dialog.findViewById(R.id.btn_cancel_proj);

        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText editProjName = (EditText) dialog.findViewById(R.id.edit_proj_name);
                String projName = editProjName.getText().toString();
                if (rmProject == null) {
                    rmProject = new RMProject();
                }
                rmProject.setName(projName);
                if (projectDBHelper == null) {
                    projectDBHelper = new RMProjectDBHelper(ProjectsActivity.this);
                }
                projectDBHelper.addProject(rmProject);
                dialog.dismiss();
            }
        });

        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

private String[] getProjectNames() {
    LinkedList<RMProject> projects = (LinkedList<RMProject>) projectDBHelper.getAllProjects();
    String[] names = new String[projects.size()];
    int i = 0;
    for (RMProject p : projects) {
        names[i++] = p.getName();
    }
    return names;
}
}

带有自定义 DbHelper 类的 fragment :

public class RMProjectDBHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "RM_DB";
private static final String TABLE_PROJECT = "PROJECT";
private static final String[] COLUMNS = {"id_project", "project_name"};
private static final int DB_VERSION = 1;
public RMProjectDBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}
//.....some code...
public void deleteProject(int id){
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_PROJECT, "id_project = ?", new String[]{String.valueOf(id)});
    db.close();
    Log.d("deleteProject with id: ", Integer.toString(id));
}
public int findIdByName(String name){
    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT PROJECT.id_project FROM PROJECT WHERE PROJECT.project_name = '"+name+"'";
    Cursor cursor = db.rawQuery(selectQuery,null);
    int id=-1;
    while (cursor.moveToNext()){
        id = cursor.getInt(cursor.getColumnIndex("id_project"));
        Log.i("LOGGING:"," FIND ID BY NAME: ID="+id);
    }
    return id;
}

最佳答案

在删除操作中再次获取数据,然后再次调用 adapter.notifyDataSetChanged 它将起作用

关于Android - 如何在从数据库中添加/删除项目后动态刷新 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23055121/

相关文章:

android - 谷歌云功能 Node.js Firebase 网址

android - 在Android中更改滚动条颜色

c# - 将 ListView 项目文本颜色设置为黑色 - Android C# Xamarin

android - 如何在 Android 中更改列表项的背景颜色?

iphone - 在网络移动设备上购买电子商务

android - Kotlin ArrayAdapter 错误 : None of the following functions can be called with the arguments supplied

Android 元素之间的相对布局间距

java - 如何在操作栏中制作自定义进度条?

android - 在 ListView 上长按停止单击操作

android - 有没有办法从主要 Activity 中隐藏特定的 ListView 项目?