滚动ExpendableListView后计数器的值发生变化

我有一个ExpandableListView项目和列表项我有TextView有两个按钮来增加或减少TextView上的点击值。 每次我尝试滚动列表时都会出现此问题。 如果我增加一个项目然后滚动列表值混合(因为ListView保持循环其视图),我不知道如何解决它。

我已经尝试了很多我在这里找到的方法,所以是的,这可能是重复的,但我无法用我找到的任何方法解决我的问题。

我的ExpandableListAdapter.java

import android.content.Context; import android.graphics.Typeface; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.TextView; import java.util.HashMap; import java.util.List; public class ExpandableListAdapter extends BaseExpandableListAdapter { public static class ViewHolder { TextView childText; TextView counterText; Button addItemButton; Button deleteItemButton; int quantity = 0; } private Context context; private List listDataHeader; private HashMap<String, List> listHashMap; public ExpandableListAdapter(Context context, List listDataHeader, HashMap<String, List> listHashMap) { this.context = context; this.listDataHeader = listDataHeader; this.listHashMap = listHashMap; } @Override public int getGroupCount() { return listDataHeader.size(); } @Override public int getChildrenCount(int groupPosition) { return listHashMap.get(listDataHeader.get(groupPosition)).size(); } @Override public Object getGroup(int groupPosition) { return listDataHeader.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return listHashMap.get(listDataHeader.get(groupPosition)).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if(convertView == null) { LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.list_group, null); } TextView listHeader = (TextView) convertView.findViewById(R.id.list_header); listHeader.setTypeface(null, Typeface.BOLD); listHeader.setText(headerTitle); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if(convertView == null) { LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.list_item, null); TextView textListChild = (TextView) convertView.findViewById(R.id.list_item_header); TextView itemsCounter = (TextView) convertView.findViewById(R.id.items_counter); Button addItemButton = (Button) convertView.findViewById(R.id.plus_btn); viewHolder = new ViewHolder(); viewHolder.childText = textListChild; viewHolder.counterText = itemsCounter; viewHolder.addItemButton = addItemButton; convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } final String childText = (String) getChild(groupPosition, childPosition); viewHolder.childText.setText(childText); viewHolder.addItemButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { //int itemCount = Integer.parseInt((String)viewHolder.counterText.getText()); //itemCount++; viewHolder.quantity++; viewHolder.counterText.setText( Integer.toString(viewHolder.quantity)); PutOrderDrinks.addOrder(childText); } }); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

试试这个适配器:

 public class ExpandableListAdapter extends BaseExpandableListAdapter { class ViewHolder { TextView childText; TextView counterText; Button addItemButton; Button deleteItemButton; } class ChildItem{ String name; int quantity; ChildItem(String name, int quantity){ this.name = name; this.quantity = quantity; } } class Pos{ int group; int child; Pos(int group, int child){ this.group = group; this.child = child; } } private Context context; private List listDataHeader; //private HashMap> listHashMap; private HashMap> listChildMap; public ExpandableListAdapter(Context context, List listDataHeader, HashMap> listHashMap) { this.context = context; this.listDataHeader = listDataHeader; listChildMap = new HashMap<>(); for(int i=0; i listTemp = new ArrayList<>(); for(int j=0; j 

在ViewHolder中存储数量不是一个好主意。 希望下面的示例帮助:)

MainActivity.java:

 public class MainActivity extends Activity { Button clearChecks, putOrder; ExpandableListView expandableListView; ExpandableListViewAdapter expandableListAdapter; int lastExpandedPosition = -1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); expandableListView = findViewById(R.id.expandedListView); clearChecks = findViewById(R.id.btnClearChecks); putOrder = findViewById(R.id.btnPutOrder); List listTitle = genGroupList(); expandableListAdapter = new ExpandableListViewAdapter(this, listTitle, genChildList(listTitle)); expandableListView.setAdapter(expandableListAdapter); expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { if(lastExpandedPosition != -1 && (lastExpandedPosition != groupPosition)){ expandableListView.collapseGroup(lastExpandedPosition); } lastExpandedPosition = groupPosition; } }); clearChecks.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { expandableListAdapter.clearChecks(); } }); putOrder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ArrayList putOrder = expandableListAdapter.getOrderList(); String msg = ""; for(int i=0; i genGroupList(){ ArrayList listGroup = new ArrayList<>(); for(int i=1; i<10; i++){ listGroup.add("Group: " + i); } return listGroup; } private Map> genChildList(List header){ Map> listChild = new HashMap<>(); for(int i=0; i testDataList = new ArrayList<>(); int a = (int)(Math.random()*8); for(int j=0; j 

ChildItemSample.java:

 public class ChildItemSample { private boolean checked = false; private String name; private int qty; public int getQty() { return qty; } public void setQty(int qty) { this.qty = qty; } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public String getName() { return name; } public ChildItemSample(String name, int qty){ this.name = name; this.qty = qty; } } 

ExpandableListViewAdapter.java:

 public class ExpandableListViewAdapter extends BaseExpandableListAdapter { private Context context; private List listGroup; private Map> listChild; private int checkedBoxesCount; private boolean[] checkedGroup; public ExpandableListViewAdapter(Context context, List listGroup, Map> listChild) { this.context = context; this.listGroup = listGroup; this.listChild = listChild; checkedBoxesCount = 0; checkedGroup = new boolean[listGroup.size()]; } @Override public int getGroupCount() { return listGroup.size(); } @Override public int getChildrenCount(int groupPosition) { return listChild.get(listGroup.get(groupPosition)).size(); } @Override public String getGroup(int groupPosition) { return listGroup.get(groupPosition); } @Override public ChildItemSample getChild(int groupPosition, int childPosition) { return listChild.get(listGroup.get(groupPosition)).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean b, View view, ViewGroup viewGroup) { String itemGroup = getGroup(groupPosition); GroupViewHolder groupViewHolder; if(view == null){ LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.expanded_list_group, null); groupViewHolder = new GroupViewHolder(); groupViewHolder.tvGroup = view.findViewById(R.id.tv_group); groupViewHolder.cbGroup = view.findViewById(R.id.cb_group); groupViewHolder.cbGroup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int pos = (int)view.getTag(); checkedGroup[pos] = !checkedGroup[pos]; for(ChildItemSample item : listChild.get(listGroup.get(pos))){ item.setChecked(checkedGroup[pos]); } notifyDataSetChanged(); } }); view.setTag(groupViewHolder); }else { groupViewHolder = (GroupViewHolder)view.getTag(); } groupViewHolder.tvGroup.setText(String.format("%s (%d)", itemGroup, getChildrenCount(groupPosition))); if(checkedGroup[groupPosition]) groupViewHolder.cbGroup.setChecked(true); else groupViewHolder.cbGroup.setChecked(false); groupViewHolder.cbGroup.setTag(groupPosition); return view; } @Override public View getChildView(int groupPosition, int childPosition, boolean b, View view, ViewGroup viewGroup) { ChildItemSample expandedListText = getChild(groupPosition,childPosition); ChildViewHolder childViewHolder; if(view == null){ LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.expanded_list_item, null); childViewHolder = new ChildViewHolder(); childViewHolder.tvChild = view.findViewById(R.id.tv_child); childViewHolder.cbChild = view.findViewById(R.id.cb_child); childViewHolder.tvQty = view.findViewById(R.id.tv_qty); childViewHolder.btInc = view.findViewById(R.id.bt_inc); childViewHolder.btDec = view.findViewById(R.id.bt_dec); childViewHolder.cbChild.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CheckBox cb = (CheckBox) view; Pos pos = (Pos) cb.getTag(); ChildItemSample selectedItem = getChild(pos.group, pos.child); selectedItem.setChecked(cb.isChecked()); if(cb.isChecked()){ checkedBoxesCount++; Toast.makeText(context,"Checked value is: " + getChild(pos.group, pos.child).getName(), Toast.LENGTH_SHORT).show(); }else { checkedBoxesCount--; if(checkedBoxesCount == 0){ Toast.makeText(context,"nothing checked",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context,"unchecked",Toast.LENGTH_SHORT).show(); } } notifyDataSetChanged(); } }); childViewHolder.btInc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Button bt = (Button) view; Pos pos = (Pos) bt.getTag(); ChildItemSample selectedItem = getChild(pos.group, pos.child); selectedItem.setQty(selectedItem.getQty() + 1); notifyDataSetChanged(); } }); childViewHolder.btDec.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Button bt = (Button) view; Pos pos = (Pos) bt.getTag(); ChildItemSample selectedItem = getChild(pos.group, pos.child); if(selectedItem.getQty() > 0) selectedItem.setQty(selectedItem.getQty() - 1); notifyDataSetChanged(); } }); }else { childViewHolder = (ChildViewHolder)view.getTag(); } childViewHolder.cbChild.setChecked(expandedListText.isChecked()); childViewHolder.tvChild.setText(expandedListText.getName() + " :"); childViewHolder.tvQty.setText("" + expandedListText.getQty()); childViewHolder.cbChild.setTag(new Pos(groupPosition, childPosition)); childViewHolder.btInc.setTag(new Pos(groupPosition, childPosition)); childViewHolder.btDec.setTag(new Pos(groupPosition, childPosition)); view.setTag(childViewHolder); return view; } public void clearChecks() { for(int i=0; i value : listChild.values()) { for (ChildItemSample sample : value) { sample.setChecked(false); } } checkedBoxesCount = 0; notifyDataSetChanged(); } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private class GroupViewHolder { CheckBox cbGroup; TextView tvGroup; } private class ChildViewHolder { CheckBox cbChild; TextView tvChild; TextView tvQty; Button btInc; Button btDec; } private class Pos { int group; int child; Pos(int group, int child){ this.group = group; this.child = child; } } public ArrayList getOrderList(){ ArrayList overallOrder = new ArrayList<>(); for(int i=0; i 0){ ChildItemSample newOrder = new ChildItemSample(getGroup(i) + ">" + getChild(i, j).getName(), getChild(i, j).getQty()); overallOrder.add(newOrder); } } } return overallOrder; } } 

activity_main.xml中:

          

expanded_list_group.xml:

      

expanded_list_item.xml: