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

时间:2014-01-10 10:13:23

标签: java android listview listadapter

我正在填充我的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的一部分)?

3 个答案:

答案 0 :(得分:1)

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

您已经将上下文传递给您的适配器,因此只需将其与HomeActivity一起投射以获取HomeActivity的实例并使用它!

HomeActivity activity = (HomeActivity) context;

答案 1 :(得分:1)

虽然Lalit Poptani提供的答案可能被认为是一种方法(事实上 - 这是最简单的解决方案),但在实际应用中,它只会给代码带来一些混乱,因为它隐藏了一般的想法 - 您的Activity应对数据库更新做出反应。这意味着更新通知应尽可能接近实际数据库更新(绝对不是Adapter)。

在您的情况下,您有DatabaseHandler负责数据库修改,因此它应该通知Activity有关此类更新的信息。怎么样?嗯,你有很多选择,比如:

  • 直接从DatabaseHandler
  • 添加\ remove侦听器
  • BroadcastReceiver注册Activity并从DatabaseHandler发送广播
  • 使用ContentProvider + CursorLoader,其中包含此类更新的内置机制

精确的解决方案取决于您的要求。

答案 2 :(得分:1)

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

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