gpt4 book ai didi

Android 可扩展 ListView - onClickListener,用于具有持久状态的子项中的按钮

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

我目前在创建 ExpandableListView 时遇到问题。我不确定目前发生了什么,但我会解释我正在尝试做什么。

我以编程方式分配某一天的膳食。在每顿饭中(标题是组)是一个包含投票和订购按钮的 child 。当对一顿饭下订单时,这两者都会更改为“已订购”。如果下了另一个订单,则先前的订单按钮将返回到“订单”状态,并且所选的订单将变为已订购。投票也是如此。我通过为我的按钮设置一个点击监听器来解决这个问题,该监听器循环遍历所有其他按钮并将它们的文本设置为“order”/“vote”并将当前按钮文本设置为 ordered。

这在极少数情况下工作正常 - 但大多数时候,当我订购/投票一个项目时,它会将所选项目更改为“已订购”,并将我的可扩展 ListView 中的最后一个元素也更改为已订购。然后,如果我订购,假设是第三个元素,关闭并重新打开第二个元素,它也会更改为已订购,反之亦然。有时他们都改回订单或都改成订单。我发现很难弄清楚为什么会发生这种情况。

我相信它可能与 getChildView 函数有关。当我遍历打开每个元素的列表时, View 永远不会为最后一个元素设置,即使它已经分配了适当的数据。

我是不是误解了 ExpandableListView 的一个主要概念,还是还有别的东西。

我认为这里的 getChildView 函数可能有问题。我还将在下面提供其他相关类(class)的链接。如果您需要更多信息,请随时询问。

//Static class view holder
static class ViewHolder {
protected Button oBut;
protected Button vBut;
protected TextView description;
}

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
//Getting the appropriate child for the group and position
ExpandListChild child = (ExpandListChild) getChild(groupPosition, childPosition);

View view = null;

//Set up if doesn't exist
if (convertView == null) {
Log.d("OnClickListener", "groupPosition: " + groupPosition + " childPosition: " + childPosition);
Log.d("OnClickListener", "View being set up for: " + child.getName() + " desc: " + child.getDescription());

LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
view = infalInflater.inflate(R.layout.expandlist_child_item_todays, null);

//Attempt at viewholder
final ViewHolder holder = new ViewHolder();
holder.description = (TextView) view.findViewById(R.id.mealDescription);
holder.vBut = (Button)view.findViewById(R.id.vote);
holder.oBut = (Button)view.findViewById(R.id.order);

view.setTag(holder);
}
else {
view = convertView;
}

ViewHolder holder = (ViewHolder) view.getTag();

holder.description.setText(child.getDescription());
holder.description.setTag(child.getTag());

holder.oBut.setOnClickListener(new OrderOnClick(groups, (Activity)context, holder.oBut, view, child));
holder.vBut.setOnClickListener(new VoteOnClick(groups, (Activity)context, holder.vBut, view, child));

return view;
}

ExpandListAdapterTodays (扩展并扩展我的 BaseExpandableListAdapter)

ExpandListAdapter (扩展 BaseExpandableListAdapter)

VoteOnClick (实现投票成功后更改按钮文本的类)

最佳答案

android 上的 listviews 高效工作的方式是它们实现了“ View 回收”方法,如果某些 View 离开屏幕,则相同的 View 将放回屏幕上的某个位置,并更改所有必要的位。这让事情使用更少的资源,实际上重复使用相同的资源,但如果你需要像你一样以特定顺序持久存在的状态,就会造成严重破坏。你应该做的是实现某种 map 或数组列表,其中对象的位置对应于它在 ListView 中的位置,然后通过制作的对象进行更改。有点蹩脚,但它有点像你的适配器的适配器方法。

现在我深表歉意,因为我无法准确地想象 onlick 方法应该如何工作,但通过它来看......就像:

for (int i = 0; i < groups.size(); i++) {
....
but.setText("Vote");

会变成

ArrayList<String> group_string_states = new ArrayList<String> ();

private void fillGroupStringStates () {
for(int i = 0; i < groups.length; i++) {
group_string_states.add("Order");
}
}

....

for (int i = 0; i < group_string_states.size(); i++) {
....
group_string_states.set(i, "Vote");

然后你做一个条件,比如如果 group_string_states.get[position] 说“投票”,则执行此操作。

好吧,这就是我尝试做的方式。我希望它有所帮助,如果没有,我真的很抱歉。

关于Android 可扩展 ListView - onClickListener,用于具有持久状态的子项中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12803064/

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