【问题标题】:How do I add child items dynamically onClick on the parent Items expandable listview in android?如何在android中的父项可扩展列表视图上动态添加子项?
【发布时间】:2017-03-19 18:15:57
【问题描述】:

我正在开发一个 Android 应用程序,其中包含一个可扩展列表视图,用于从 Web 服务加载数据,但我不想在启动时加载整个数据,但首先加载父列表,然后单击父列表展开特定列表项列表视图的子项加载该特定项的子项,所以首先是否可能?

谢谢

【问题讨论】:

  • 确定:您使用的是什么适配器? CursorTreeAdapter ?
  • 不,我正在使用 BaseExpandableListAdapter。
  • 使用 BaseExpandableListAdapter 你需要做更多的工作

标签: android expandablelistview


【解决方案1】:

我不完全确定您的问题是什么意思,但如果您想要动态加载 BaseExpandableListAdapter 中的子项,例如当您单击相关组标题时加载“子项”(如下所示),我有一个解决方案。

v 组标题 1 | -- 子项 1 | -- 子项目 2 v 组标题 2 | -- 子项 1 | -- 子项目 2

在您的 Activity 中,像这样找到您的 ExpandableListView:

ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.expandable_list_view);

然后添加一个监听器来检查群组点击:

expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener()
{
    @Override
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id)
    {
        if (expandableListView.isGroupExpanded(groupPosition))
            expandableListView.collapseGroup(groupPosition);
        else
            new BackgroundTask(groupPosition).execute();

        return true;
    }
});

返回 true 将“消耗”单击并在单击时停止组的默认扩展。这就是为什么在您的 ASyncTask 中,您需要手动展开它。如果返回 false,列表视图将在 GUI 中自动展开,并且在您折叠并重新展开组之前,您不会看到后台计算的结果。

在我的代码中,我有一个 SparseBooleanArray 来跟踪是否已经为给定组设置了数据,并且我在 onGroupClick() 方法中检查了该值;我这样做是为了在扩展组时只需要加载一次数据,但显然,如果您希望数据在每次扩展时都更改,那么您不希望这样做。您的问题比较模糊,所以我不确定您使用的确切场景是什么。

private class BackgroundTask extends AsyncTask<Void, Void, List<ReturnType>>
{
    int groupPosition;

    private BackgroundTask(int groupPosition)
    {
        this.groupPosition = groupPosition;
    }

    @Override
    protected List<ReturnType> doInBackground(String... params)
    {
        // TODO: Do your background computation...
        // Then return it
    }

    @Override
    protected void onPostExecute(List<ReturnType> resultsList)
    {
        super.onPostExecute(resultsList);

        // TODO: Add the resultsList to whatever structure you're using to store the data in the ListView Adapter
        expandableListView.expandGroup(groupPosition);
    }
}

我不确定这是否是最好的方法,但它确实对我有用。

【讨论】:

    【解决方案2】:

    我需要知道 api 是什么样的。无论这个“父”数据是什么,都可能来自某个 api 吗?你能从另一个 api 调用中检索这个“子”数据吗?

    可以做到的一种方法是:

    1. 进行 api 调用 -> getParentList() 以检索进入父级的所有元素。
    2. 将此列表绑定到您的适配器中作为父值
    3. onClick 每个父项,创建另一个返回该父项的子元素的 api,即 -> getChildOfParent(int parent_id) 返回该特定父项的信息。

    注意事项

    请记住,在绑定到 UI 时,您应该有某种策略。这个名单有多大?需要分页吗?你将如何处理分页?您将如何/在哪里缓存您的项目列表?用户体验应该是什么样的?

    这些都是需要考虑的事情,还有更多。

    你应该考虑的一些东西是改造/okhttp、sqlite/realm、毕加索(如果你想扩展图像)、CursorAdapter(分页)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 2013-02-27
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多