gpt4 book ai didi

android - 更新 ExpandableListView 中的子项

转载 作者:太空狗 更新时间:2023-10-29 13:19:46 24 4
gpt4 key购买 nike

我有一个 ExpandableListView 风格的购物车。

enter image description here

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

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

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

自定义适配器 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);

最佳答案

行 View 被 ListView 重用,这就是为什么点击似乎改变了多行。如果您稍微调整一下列表,您还会注意到加号/减号实际上是随机的,之前点击过哪些并不重要。

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

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

这确保新行和重复使用的行都显示正确的图标。


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

这个问题其实没有什么随机的,只是我解释的一个捷径。 :)

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

当新行进入屏幕时,ListView 首先检查堆中是否有剩余(所需 View 类型)。如果找到,您的适配器将有一次机会用新数据更新所有内容。如果您忘记更新任何内容,您将留下早期项目的残余 - 就像您原始问题中的 drawable。

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

如果您没有创建新的 OnClickListener 实例(例如,您将代码放在上面的 if 中),groupPositionchildPosition 永远不会改变初始值,因此单击一行可能会更新一个完全不同的模型对象!即使 UI 看起来工作正常,模型也会不一致。

将 View 更新逻辑从 Adapter 移动到您的 ViewHolder 并为其提供一个设置标题、监听器等的 bindModel(ChildType child) 方法可能会很有用。这样更容易每次都阅读并验证所有设置是否正确。
(新的 RecyclerView 的工作原理类似,你应该查一下。)


tl;dr:必须确保在您的 Adapter 实现中更新一切,这取决于行的数据模型,否则龙会消耗我们所有人。

关于android - 更新 ExpandableListView 中的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30435670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com