I got editText inside Expandable List to be the number of childcount according to the result of the editText to be edited. But editText position is always coming in different or childcount coming wrong and I get this error:
("java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3")
My ExpandableListAdapter:
public class ExpandableListAdapter extends BaseExpandableListAdapter {
public ExpandableListView expandableListView;
private ChildViewHolder childViewHolder;
private GroupViewHolder groupViewHolder;
private Context _context;
private ArrayList<BBQrValidateModel.Campaigns> mDataCampaignModel; //stampcount and totalneed
public ExpandableListAdapter(ArrayList<BBQrValidateModel.Campaigns> mDataCampaignModel,
Context context, ExpandableListView expandableListView) {
this._context = context;
this.mDataCampaignModel = mDataCampaignModel;
this.expandableListView = expandableListView;
}
@Override
public Object getChild(int groupPosition, int childPosititon) {
return campaign.coffeeGiftCount;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
BBQrValidateModel.Campaigns campaign = mDataCampaignModel.get(groupPosition);
if (convertView == null) {
convertView = MainActivity.inflater.inflate(R.layout.row_campaign_buy_or_hide, parent, false);
childViewHolder = new ChildViewHolder();
childViewHolder.txtCoffeeGift = convertView.findViewById(R.id.txtCoffeeGift);
childViewHolder.txtCoffeeHide = convertView.findViewById(R.id.txtCoffeeHide);
childViewHolder.txtCoffeeUse = convertView.findViewById(R.id.txtCoffeeUse);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
childViewHolder.txtCoffeeGift.setText(campaign.prize);
//kullan ve sakla tıklanınca modeldekı degısıklıgı buradan yapıcaz
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
BBQrValidateModel.Campaigns campaign = mDataCampaignModel.get(groupPosition);
return campaign.coffeeGiftCount;
}
@Override
public Object getGroup(int groupPosition) {
return mDataCampaignModel.get(groupPosition);
}
@Override
public int getGroupCount() {
return (mDataCampaignModel == null) ? 0 : mDataCampaignModel.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
final BBQrValidateModel.Campaigns campaign = mDataCampaignModel.get(groupPosition);
if (convertView == null) {
convertView = MainActivity.inflater.inflate(R.layout.row_campaigndetail, parent, false);
groupViewHolder = new GroupViewHolder();
groupViewHolder.txtStampCount = convertView.findViewById(R.id.txtStampCount);
groupViewHolder.txtCampaignName = convertView.findViewById(R.id.txtCampaignName);
groupViewHolder.txtTotalNeeds = convertView.findViewById(R.id.txtTotalNeeds);
groupViewHolder.btnFreepProductNum1 = convertView.findViewById(R.id.btnFreepProductNum1);
groupViewHolder.btnFreepProductNum2 = convertView.findViewById(R.id.btnFreepProductNum2);
groupViewHolder.btnFreepProductNum3 = convertView.findViewById(R.id.btnFreepProductNum3);
groupViewHolder.btnFreepProductNum4 = convertView.findViewById(R.id.btnFreepProductNum4);
groupViewHolder.btnFreepProductNum5 = convertView.findViewById(R.id.btnFreepProductNum5);
groupViewHolder.edtPurchasedCoffeeCount = convertView.findViewById(R.id.edtPurchasedCoffeeCount);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
groupViewHolder.edtPurchasedCoffeeCount.setId(groupPosition);
groupViewHolder.txtTotalNeeds.setText(String.valueOf(campaign.totalNeeds));
groupViewHolder.txtStampCount.setText(String.valueOf(campaign.stampCount));
groupViewHolder.txtCampaignName.setText(campaign.description);
if (groupViewHolder.edtPurchasedCoffeeCount.getText().toString().isEmpty()) {
campaign.edtPurchasedCoffeeCount = 0;
} else {
campaign.edtPurchasedCoffeeCount = Integer.valueOf(groupViewHolder.edtPurchasedCoffeeCount
.getText().toString());
}
final int totalneeds = campaign.totalNeeds;
final int stampcount = campaign.stampCount;
campaign.coffeeGiftCount = (stampcount + campaign.edtPurchasedCoffeeCount) / totalneeds;
TextWatcher inputTextWatcher = new TextWatcher()
{
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (stampcount + campaign.coffeeGiftCount > totalneeds)
{
campaign.coffeeGiftCount = (stampcount + campaign.edtPurchasedCoffeeCount) / totalneeds;
}
}
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
public void afterTextChanged(Editable s)
{
notifyDataSetChanged();
}
};
groupViewHolder.edtPurchasedCoffeeCount.addTextChangedListener(inputTextWatcher);
expandableListView.expandGroup(groupPosition);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
My ViewHolders (inner class in adapter):
public final class GroupViewHolder {
TextView txtStampCount;
TextView txtCampaignName;
TextView txtTotalNeeds;
EditText edtPurchasedCoffeeCount;
Button btnFreepProductNum1;
Button btnFreepProductNum2;
Button btnFreepProductNum3;
Button btnFreepProductNum4;
Button btnFreepProductNum5;
}
public final class ChildViewHolder {
TextView txtCoffeeGift;
TextView txtCoffeeUse;
TextView txtCoffeeHide;
}
}