Java 更改内部适配器内容后在ListView上调用刷新
我正在填充我的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
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();