我正在填充我的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);
}
现在我的ListeView上显示了x任务。
现在我正在更新我的Task Adapter类:
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());
}
});
当用户点击其中一个ListView擦除按钮时,我想从视图中删除该行。
该行确实从表中填充(填充视图),但我的问题是所呈现的行不会在现场删除,而是仅在用户打开其他活动并返回原始活动时。 / p>
我的问题是如何在TaskAdapter的onClick事件之后调用populateDemoTasksList(它是扩展活动的HomeActivity的一部分)?
答案 0 :(得分:1)
为什么不在TaskAdapter
的构造函数中传递HomeActivity的实例,并使用HomeActivity的实例调用方法populateDemoTasksList()
,然后只刷新ListView的适配器。
您已经将上下文传递给您的适配器,因此只需将其与HomeActivity一起投射以获取HomeActivity的实例并使用它!
HomeActivity activity = (HomeActivity) context;
答案 1 :(得分:1)
虽然Lalit Poptani提供的答案可能被认为是一种方法(事实上 - 这是最简单的解决方案),但在实际应用中,它只会给代码带来一些混乱,因为它隐藏了一般的想法 - 您的Activity
应对数据库更新做出反应。这意味着更新通知应尽可能接近实际数据库更新(绝对不是Adapter
)。
在您的情况下,您有DatabaseHandler
负责数据库修改,因此它应该通知Activity
有关此类更新的信息。怎么样?嗯,你有很多选择,比如:
DatabaseHandler
BroadcastReceiver
注册Activity
并从DatabaseHandler
发送广播ContentProvider
+ CursorLoader
,其中包含此类更新的内置机制精确的解决方案取决于您的要求。
答案 2 :(得分:1)
从数据库中删除后,通过调用删除列表数据源中的相同内容,并按如下方式刷新列表,
remove(getItem(position));
notifyDataSetChanged();