Android   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 我是否需要为ExpandableListView提供多个viewHolders?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我使用这个视图错误了吗?我在第165行得到一份NPE.有一个明显的原因导致我失踪吗?如果我使用expandablelistview,是否需要组视图和子视图?我标记了第165行,试图让它更容易在眼睛上.

非常感谢

获得NPE的我的expandablelistview:

public class Myexpandablelistadapter extends Baseexpandablelistadapter {

    private Context mContext;
    private ArrayList<ContactNameItems> mListDataHeader;
    private ArrayList<Boolean> phonenumbercheckStates;
    private ArrayList<String> SELEctednumbers;

    private HashMap<String, List<ContactPhoneItems>> mListDataChild;

    private ViewHolder mViewHolder;

    public Myexpandablelistadapter(Context context,
            ArrayList<ContactNameItems> listDataHeader,
            HashMap<String, List<ContactPhoneItems>> listDataChild,
            ArrayList<String> listOfnumbers) {

        mContext = context;
        mListDataHeader = listDataHeader;
        mListDataChild = listDataChild;
        SELEctednumbers = listOfnumbers;
    }

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

    @Override
    public ContactNameItems getGroup(int groupPosition) {
        return mListDataHeader.get(groupPosition);
    }

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

    @Override
    public View getGroupView(int groupPosition, Boolean isExpanded,
            View convertView, ViewGroup parent) {

        String contactName = getGroup(groupPosition).getName();
        Bitmap contactimage = getGroup(groupPosition).getImage();

        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) mContext
                    .getSystemservice(Context.LAYOUT_INFLATER_serviCE);
            convertView = inflater.inflate(R.layout.contact_name_item, null);

            mViewHolder = new ViewHolder();

            mViewHolder.mContactName = (TextView) convertView
                    .findViewById(R.id.lblListHeader);

            mViewHolder.mContactimage = (ImageView) convertView
                    .findViewById(R.id.ivContactPhoto);

            convertView.setTag(mViewHolder);
        } else {

            mViewHolder = (ViewHolder) convertView.getTag();
        }

        if (contactimage != null) {
            mViewHolder.mContactimage.setImageBitmap(contactimagE);

        } else {
            mViewHolder.mContactimage.setImageresource(R.drawable.default_contact);
        }

        mViewHolder.mContactName.setText(contactName);

        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return mListDataChild.get(mListDataHeader.get(groupPosition).getName())
                .size();
    }

    @Override
    public ContactPhoneItems getChild(int groupPosition, int childPosition) {
        return mListDataChild.get(mListDataHeader.get(groupPosition).getName())
                .get(childPosition);
    }

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

        String numberText = getChild(groupPosition, childPosition).getnumber();
        String typeText = getChild(groupPosition, childPosition).getPhoneType();

        final int mGroupPosition = groupPosition;

        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) this.mContext
                    .getSystemservice(Context.LAYOUT_INFLATER_serviCE);
            convertView = inflater.inflate(R.layout.contact_detail_item, null);

            mViewHolder = new ViewHolder();

            mViewHolder.@R_717_6165@number = (TextView) convertView
                    .findViewById(R.id.tv_phone_number);

            mViewHolder.@R_717_6165@Type = (TextView) convertView
                    .findViewById(R.id.tv_phone_typE);

            mViewHolder.mcheckBox = (checkBox) convertView
                    .findViewById(R.id.checkBox);

            convertView.setTag(mViewHolder);

        } else {

            mViewHolder = (ViewHolder) convertView.getTag();
        }

        mViewHolder.@R_717_6165@number.setText(numberText);
        mViewHolder.@R_717_6165@Type.setText(typeText);

        phonenumbercheckStates = new ArrayList<Boolean>();

        for (int i = 0; i < mListDataChild.size(); i++) {

            phonenumbercheckStates.add(false);
        }

        if (phonenumbercheckStates.get(childPosition)) {
            mViewHolder.mcheckBox.setchecked(true);
        } else {
            mViewHolder.mcheckBox.setchecked(false);
        }

        mViewHolder.mcheckBox.setOnClickListener(new View.onClickListener() {
            @Override
            public void onClick(View v) {

/*this is line 165*/    if (mViewHolder.mcheckBox.ischecked()) {  /*this is line 165*/
                    phonenumbercheckStates.set(childPosition, truE);

                    SELEctednumbers.add(mListDataChild
                            .get(mListDataHeader.get(mGroupPosition).getName())
                            .get(childPosition).getnumber());

                } else {
                    phonenumbercheckStates.set(childPosition, falsE);

                    SELEctednumbers.remove(mListDataChild
                            .get(mListDataHeader.get(mGroupPosition).getName())
                            .get(childPosition).getnumber());
                }
            }
        });

        return convertView;
    }

    @Override
    public Boolean isChildSELEctable(int groupPosition, int childPosition) {
        return false;
    }

    @Override
    public Boolean hasStablEIDs() {
        return false;
    }

    public ArrayList<Boolean> getcheckednumbers() {

        return phonenumbercheckStates;
    }

    public ArrayList<String> getSELEctednumbers() {

        return SELEctednumbers;
    }

    private class ViewHolder {

        TextView mContactName;
        TextView @R_717_6165@number;
        TextView @R_717_6165@Type;
        ImageView mContactimage;
        checkBox mcheckBox;
    }
}

如果它有帮助,这是日志:

01-25 04:34:31.695: E/AndroidRuntime(7074): FATAL EXCEPTION: main
01-25 04:34:31.695: E/AndroidRuntime(7074): java.lang.NullPointerException
01-25 04:34:31.695: E/AndroidRuntime(7074):     at com.psesto.journeysend.contactpicker.Myexpandablelistadapter$1.onClick(Myexpandablelistadapter.java:165)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at android.view.View.performClick(View.java:4204)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at android.widget.CompoundButton.performClick(CompoundButton.java:100)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at android.view.View$PerformClick.run(View.java:17355)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at android.os.Handler.handleCallBACk(Handler.java:725)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at android.os.Handler.dispatchmessage(Handler.java:92)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at android.os.Looper.loop(Looper.java:137)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at java.lang.reflect.Method.invokeNative(Native Method)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at java.lang.reflect.Method.invoke(Method.java:511)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-25 04:34:31.695: E/AndroidRuntime(7074):     at dalvik.system.NativeStart.main(Native Method)

解决方法:

您的适配器中有一个ViewHolder引用用于所有视图.这没有任何意义,因为List中的每个View都有自己的ViewHolder实例,您可以通过View.getTag()获得它.

您可以使用您需要的位置设置一个int []作为checkBox标记

    int[] positions = new int[2];
    positions[0] = childPosition;
    positions[1] = groupPosition;
    mViewHolder.mcheckBox.setTag(positions);

并在onClick()

    checkBox Box = (checkBox) v;
    int[] posTag = (int[]) v.getTag();

然后你有状态的checkBox其余的位置

大佬总结

以上是大佬教程为你收集整理的android – 我是否需要为ExpandableListView提供多个viewHolders?全部内容,希望文章能够帮你解决android – 我是否需要为ExpandableListView提供多个viewHolders?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: