【问题标题】:Android get convertView from BaseExpandableListAdapterAndroid 从 BaseExpandableListAdapter 获取 convertView
【发布时间】:2015-08-15 14:44:06
【问题描述】:

我需要调用 BaseExpandableListAdapter 方法

        @Override
        public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent)

或类似的东西来获取方法返回的视图。问题是,如果我调用该方法,我必须将 null 传递给 convertView,这将重新膨胀视图,这就是我需要的视图。

我需要该视图,因为它包含一个自定义视图,其中包含我需要从中检索的代码,而无需将其重置为自身的新实例。以这种方法为例:

        public ArrayList<CustomViewData> getCustomViewData ()
        {
            ArrayList<CustomViewData> customViewDatas = new ArrayList<>();
            for(int i = 0; i < getGroupCount(); i++)
                if(listView.isGroupExpanded(i))
                {
                    View v = //getConvertView
                    customViewDatas.add((CustomViewData) v.findViewById(R.id.customView);
                }
            return customViewDatas;
         }

如何在不创建新视图的情况下从 ExpandableListView(或其基本适配器)获取实际视图?

【问题讨论】:

    标签: android view expandablelistview expandablelistadapter


    【解决方案1】:

    永远不要存储由getView() 生成的Views。这是一种非常危险的做法。您可能会泄露Views。此外,适配器会在您滚动时回收 Views,因此您存储的内容可能无法代表您的需求。

    你想错了方向。适配器将数据绑定到Views。意思是,View 的呈现方式取决于数据本身。如果由于某些事件而需要更新Views 之一……那么必须更新代表该View 的数据。然后适配器可以相应地重新渲染它的View

    解决此类问题时,只要不断告诉自己“如果我需要修改View,那么我需要修改它的数据。”

    【讨论】:

    • 但数据存储在自定义视图中。我不能每次都重新生成视图,并且没有 onViewUnBound 方法或其他东西,无法保存视图数据。
    • 不确定我是否完全关注。您不应该在视图中存储数据。位置 1 的视图在滚动后可能最终位于位置 10,因为它们被适配器回收。如果您希望视图以特定方式呈现,您的适配器需要存储该数据/状态,以便它可以相应地适当地呈现视图。另外,我刚刚注意到您将视图存储在该 ArrayList 中。你为什么这样做?这是非常危险的,几乎不推荐。
    • 这是因为它们是自定义视图。例如,我扩展了 ViewSlider 以添加位置文本视图。但无论如何,我实际上得到了一个完美的解决方案。检查新答案!感谢您的信息。
    • 如果您需要使用自定义视图,您可以覆盖适配器中的getView() 方法。很抱歉我没有提供帮助,但我觉得你仍然走错了路。请查看commonsware.com 以获取有关如何使用适配器的帮助。他在这里也非常活跃。
    【解决方案2】:

    这个问题的解决方案并不容易。

    无法复制 ArrayAdapter 对 RecyclerView 适配器的功能等行为。

    相反,如果您需要从未自动存储的自定义视图中获取数据,请覆盖

    @Override
    public void onViewDetachedFromWindow (ViewHolder holder)
    {
        //STORE VIEW DATA
        super.onViewDetachedFromWindow(holder);
    }
    
    @Override
    public void onViewRecycled(ViewHolder holder)
    {
        //STORE VIEW DATA
        super.onViewRecycled(holder);
    }
    

    使用这些方法从存储在 ViewHolder 中的视图中获取数据。

    您必须在使用完回收器后从可见视图中获取数据。这些可见视图不会自动回收,因此您必须从仍在适配器上的可见视图中检索视图数据。

    为此,请参阅this 帖子。

    【讨论】:

      猜你喜欢
      • 2016-07-31
      • 2013-04-11
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多