在ExpandableListView中更新子项

奥斯本·考克斯

我有一个ExpandableListView样式的购物车。

在此处输入图片说明

我正在尝试更新子项的正确可绘制图形。所有子项开始时都显示一个“ +”,我希望在单击时将其更改为“-”。

我尝试在适配器中执行此操作,但是当我滚动浏览列表并打开其他组选项卡时,我注意到那些以前未单击的项目中的项目也正在被修改。

我不确定适配器中的视图回收是否存在问题,或者是否有其他原因导致此问题。这是我的代码:

自定义适配器getChildView方法

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

    final View row;
    final FullMenuItemHolder fullMenuItemHolder;

    if (childView == null) {

        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.full_menu_child_item, parent, false);
        fullMenuItemHolder = new FullMenuItemHolder(row);
        row.setTag(fullMenuItemHolder);
    }

    else {
        row = childView;
        fullMenuItemHolder = (FullMenuItemHolder) row.getTag();
    }


    // set item name
    fullMenuItemHolder.title.setText(getChild(groupPosition, childPosition).getVenue_item_name());

    row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //check to see if item flagged as added to cart and set the respective drawable image
            if (!getChild(groupPosition,childPosition).getAddedToCart()) {
                getChild(groupPosition,childPosition).setAddedToCart(true);
                fullMenuItemHolder.title.setCompoundDrawablesWithIntrinsicBounds(null, null, fragment.getResources().getDrawable(R.drawable.remove), null);


            } else {
                getChild(groupPosition,childPosition).setAddedToCart(false);
                fullMenuItemHolder.title.setCompoundDrawablesWithIntrinsicBounds(null, null, fragment.getResources().getDrawable(R.drawable.add), null);

            }
        }
    });



    return row;
}

在Fragment中设置适配器 (服务器下载后从asyncTask中的onPostExecute调用)

 fullMenuExpListAdapter = new FullMenuExpListAdapter(this.getActivity(), listHeaderNames, listChildItems, this);
 expandableListView.setAdapter(fullMenuExpListAdapter);
z

ListView可以重新使用行视图,这就是为什么单击看起来会更改多行的原因。如果您要稍微摆动一下列表,您还会注意到加号/减号实际上是随机的,之前单击过的哪个都无所谓。

在此行之后,您应手动更新复合可绘制对象,类似于OnClickListener:

// set item name
fullMenuItemHolder.title.setText(getChild(groupPosition, childPosition).getVenue_item_name());

这样可以确保新行和重用行均显示正确的图标。


(我对您的评论的回复太长了。)

实际上,这个问题没有任何随机性,对我来说,这只是一个捷径。:)

这样想:将最后一个像素滚动出来时,任何完全离开屏幕的行都会扔到回收堆上。它保持原样-没有子视图会自动清除或修改。

当新行进入屏幕时,ListView首先检查堆中是否有剩余的(所需视图类型)。如果找到,则您的适配器将有一次机会用新数据更新所有内容。如果您忘记更新任何内容,则将留下较早项目的剩余内容-例如原始问题中的可绘制对象。

但是请记住,这不仅适用于视觉状态,还适用于行为

如果您没有创建新OnClickListener实例(例如,将代码放在if上面),则groupPositionchildPosition不会与初始值发生变化,因此单击一行可能会更新完全不同的模型对象!即使UI看起来似乎正确,但该模型还是不一致的。

将视图更新逻辑从适配器移动到ViewHolder,并为它提供一个bindModel(ChildType child)设置标题,侦听器等的单一方法,可能会很有用。读取和验证每次正确设置所有内容都更加容易。
(新的RecyclerView的工作原理与此类似,您应该进行查找。)


TL;博士:必须确保你的适配器实现以更新一切依赖于该行的数据模型,或龙会消耗我们所有人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在ExpandableListview中获取特定子项的视图

来自分类Dev

Expandablelistview点击子项

来自分类Dev

对ExpandableListView中的父项和子项使用自定义选择器

来自分类Dev

对ExpandableListView中的父项和子项使用自定义选择器

来自分类Dev

如何从 string.xml 中的字符串数组将子项添加到 ExpandableListView?

来自分类Dev

Android:多级 ExpandableListView 多次显示子项

来自分类Dev

CakePHP:无法为父代中的hasMany子项更新外键

来自分类Dev

列表中的子项没有正确更新?(反应/预先)

来自分类Dev

CakePHP:无法为父代中的hasMany子项更新外键

来自分类Dev

更新所有子项中的相同字段

来自分类Dev

Android ExpandableListView 子项也没有 ViewHolder 相互依赖

来自分类Dev

它仅显示子项中的一个父项,然后在所有其他父项上首先单击ExpandableListview

来自分类Dev

ExpandableListView中childDivider的宽度

来自分类Dev

Fragment Issue中的ExpandableListView

来自分类Dev

Fragment Issue中的ExpandableListView

来自分类Dev

ExpandableListView的ChildView中的CheckBox

来自分类Dev

在expandablelistview中单击onclick

来自分类Dev

Android中的多级ExpandableListView

来自分类Dev

片段中的ExpandableListView

来自分类Dev

Fragment Issue中的ExpandableListView

来自分类Dev

ExpandableListView中的IndexOutOfBoundException

来自分类Dev

TextView.setText() 不会更新 ExpandableListView 适配器中的文本

来自分类Dev

从父帐户更新客户子项

来自分类Dev

MVC中的子项加载/选项的淘汰子项

来自分类Dev

ButtonBox中的同类子项

来自分类Dev

ExpandableListAdapter中的子项的ContextMenu

来自分类Dev

在AdapterView中查找子项

来自分类Dev

在NSDictionary中查找子项

来自分类Dev

在umbraco中获取子项

Related 相关文章

热门标签

归档