android editText里面的expandableList错误的索引和错误的计数?

时间:2017-10-02 23:02:35

标签: android android-edittext expandablelistview expandablelistadapter android-textwatcher

根据要编辑的editText的结果,我将Expandable List中的editText设置为子计数。但editText位置总是出现不同或子计数出错,我收到此错误:

  

(“java.lang.IndexOutOfBoundsException:索引3无效,大小为3”)

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

我的ViewHolders(适配器中的内部类):

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

}

2 个答案:

答案 0 :(得分:0)

在getChild方法中,您返回0意味着您没有该子项的任何子对象,您应该返回该位置的子对象的组数据。

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

此代码可以帮助您,它可以帮助我。

答案 1 :(得分:0)

在代码中更改以下方法:

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