Java 更改内部适配器内容后在ListView上调用刷新

Java 更改内部适配器内容后在ListView上调用刷新,java,android,listview,listadapter,Java,Android,Listview,Listadapter,我正在填充我的ListView,如下所示: public class HomeActivity extends Activity { ... public void populateDemoTasksList() { lvTasksList = (ListView)findViewById(R.id.tasksListView); tasks_list = databaseHandler.getAllTasks(); TaskAdapt

我正在填充我的ListView,如下所示:

public class HomeActivity extends Activity { ... 

    public void populateDemoTasksList() 
    {

      lvTasksList = (ListView)findViewById(R.id.tasksListView);
      tasks_list = databaseHandler.getAllTasks();
      TaskAdapter adapter = new TaskAdapter(this, tasks_list);
      lvTasksList.setAdapter(adapter);
    }
现在我的ListView上显示了x个任务

现在我正在更新我的任务适配器类:

public class TaskAdapter implements ListAdapter, View.OnClickListener {

Context context;
List<Task> tasks;
final DatabaseHandler db_handler;     ... 
@Override
public View getView(int position, View convertView, ViewGroup parent) 
{ 
        Button task_menu_bt = (Button)root.findViewById(R.id.EraseTaskButton);
        task_menu_bt.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {

                db_handler.deleteTaskByUUID(data.getUuid());
                changeDataSource(db_handler.getAllTasks());

            //  HomeActivity.deleteTaskAndRefresh(data.getUuid());

            }
        });
公共类TaskAdapter实现ListAdapter、View.OnClickListener{
语境;
列出任务;
最终DatabaseHandler db_handler。。。
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{ 
按钮任务\菜单\ bt=(按钮)root.findViewById(R.id.EraseTaskButton);
task_菜单_bt.setOnClickListener(新视图.OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
db_handler.deleteTaskByUUID(data.getUuid());
changeDataSource(db_handler.getAllTasks());
//HomeActivity.deleteTaskAndRefresh(data.getUuid());
}
});
当用户单击其中一个ListView擦除按钮时,我想从视图中擦除该行

该行确实已从表(填充视图)中删除,但我的问题是,显示的行不会当场删除,而是只有在用户打开其他活动并返回到原始活动时才会删除


我的问题是如何在我的TaskAdapter的onClick事件之后调用PopulatedEmotaskList(它是HomeActivity的一部分,扩展了activity)?

为什么不在
TaskAdapter
的构造函数中传递HomeActivity的实例,然后调用方法
PopulatedEmotaskList()
使用HomeActivity实例,然后刷新ListView的适配器

您已经在向适配器传递上下文,所以只需将其与HomeActivity一起强制转换即可获得HomeActivity实例并使用它

HomeActivity activity = (HomeActivity) context;

而Lalit Poptani提供的答案可能被认为是一种可行的方法(事实上,这是最简单的解决方案),但在真正的应用程序中,它只会给代码带来一定程度的混乱,因为它隐藏了一个基本概念:您的
活动应该对数据库更新做出反应。这意味着更新通知应该尽可能地发布到实际数据库更新的位置(这绝对不是
适配器)

在您的情况下,您有负责数据库修改的
DatabaseHandler
,因此它应该通知
Activity
有关此类更新。如何进行?您有很多选择,例如:

  • 直接从
    DatabaseHandler
  • 在您的
    活动中注册
    BroadcastReceiver
    ,并从
    DatabaseHandler
  • 使用
    ContentProvider
    +
    CursorLoader
    ,它具有用于此类更新的内置机制

确切的解决方案取决于您的需求。

一旦您从数据库中删除,请通过调用从列表的数据源中删除相同的内容,并按如下方式刷新列表

    remove(getItem(position));
    notifyDataSetChanged();