3

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;
    }

}
enderkoca
  • 146
  • 9

2 Answers2

0

In getChild method you are returning 0 means you don't have any child object for that child ,group data where you should return the child object for that position.

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @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) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        EditText edtListChild = (EditText) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

this code help you , it's help me .

Mayank Garg
  • 1,284
  • 1
  • 11
  • 23
0

Change below method in your code:

 @Override
    public Object getChild(int groupPosition, int childPosititon)
    {
        //return 0;
        Return value of child here

    }

 @Override
    public Object getGroup(int groupPosition)
    {
        //return 0;
        Return value of group here
    }
Girish Arora
  • 966
  • 6
  • 7
  • i changed but edittext is not updated and childcount is not renewed – enderkoca Oct 03 '17 at 08:11
  • https://i.hizliresim.com/Gy21aZ.jpg like this childcount ==>(edttext+0)/totalneed – enderkoca Oct 03 '17 at 08:15
  • can you plz explain your problem more – Girish Arora Oct 03 '17 at 08:56
  • I want to divide edittext number and total need and up to the number of divisions want to see child count.But when i tried different solution edittext position is changing like this https://i.hizliresim.com/Gy21aZ.jpg – enderkoca Oct 03 '17 at 09:05
  • campaign.coffeeGiftCount = (stampcount + campaign.edtPurchasedCoffeeCount) / totalneeds; I want to see child number of campaign.coffeeGiftCount – enderkoca Oct 03 '17 at 09:06