单击图像视图时获取空对象引用

Getting null object reference on click the image view

我有适配器 class 单击项目图像视图时我想隐藏视图的某些项目。但是当我将可见性设置为可见时,我得到的结果是空的。

代码如下:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.kuliza.treebo.demo.Models.Answer;
import com.kuliza.treebo.demo.Models.ListTypeModel;
import com.kuliza.treebo.demo.R;
import com.kuliza.treebo.demo.Views.SegmentedRadioGroup;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class DailyTaskExpandableAdapter extends BaseExpandableListAdapter {

    private Context mContext;
    private List<String> mListDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<ListTypeModel>> mListDataChild;
    MyViewHolder mViewHolder;
    LayoutInflater infalInflater ;

    public DailyTaskExpandableAdapter(Context context, List<String> listDataHeader,
                                      HashMap<String, List<ListTypeModel>> listChildData) {
        this.mContext = context;
        this.mListDataHeader = listDataHeader;
        this.mListDataChild = listChildData;
    }

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

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        infalInflater = (LayoutInflater) this.mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        int itemType = getChildType(groupPosition,childPosition);

        if (convertView == null) {


            switch (itemType) {
                case 0:
                    convertView = infalInflater.inflate(R.layout.task_list_subhead_row, parent, false);
                    mViewHolder = new MyViewHolder();
                    convertView.setTag(mViewHolder);

                    break;
                case 1:
                    convertView = infalInflater.inflate(R.layout.task_list_comment_row, parent, false);
                    mViewHolder = new MyViewHolder();
                    mViewHolder.segmentImg = (SegmentedRadioGroup) convertView.findViewById(R.id.segment_img);
                    mViewHolder.mCommentlayout=(RelativeLayout)convertView.findViewById(R.id.comment_layout);
                    mViewHolder.mComment=(EditText)convertView.findViewById(R.id.comment);
                    mViewHolder.mCancel=(ImageView)convertView.findViewById(R.id.cancel);
                    mViewHolder.mSubmit=(ImageView)convertView.findViewById(R.id.submit);
                    mViewHolder.mEdit=(ImageView)convertView.findViewById(R.id.edit);
                   // view.setTag(R.id.item_name, _id);
                    convertView.setTag(mViewHolder);
                    break;
            }
        }
        else{
            mViewHolder = (MyViewHolder) convertView.getTag();
        }

        mViewHolder.TaskName = (TextView) convertView.findViewById(R.id.eventsListEventRowText);
        mViewHolder.TaskName.setText(mListDataChild.get(getGroup(groupPosition)).get(childPosition).getTask().toString());


        if(itemType==1){

            if(mListDataChild.get(getGroup(groupPosition)).get(childPosition).getAnswer().equals("No"))
                mViewHolder.segmentImg.setBackgroundResource(R.drawable.off_button);
            else if(mListDataChild.get(getGroup(groupPosition)).get(childPosition).getAnswer().equals("Yes"))
                mViewHolder.segmentImg.setBackgroundResource(R.drawable.on_button);
            else
                mViewHolder.segmentImg.setBackgroundResource(R.drawable.neutral_button);

            if(!mListDataChild.get(getGroup(groupPosition)).get(childPosition).getAnswer().equals("No")){
                mViewHolder.mCommentlayout.setVisibility(View.GONE);

            }
            else{
                mViewHolder.mCommentlayout.setVisibility(View.VISIBLE);
                mViewHolder.mCancel.setVisibility(View.VISIBLE);
                mViewHolder.mSubmit.setVisibility(View.VISIBLE);

            }

            mViewHolder.segmentImg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    if (checkedId == R.id.off_button) {
                        mListDataChild.get(getGroup(groupPosition)).get(childPosition).setAnswer("No");
                    } else if (checkedId == R.id.neutral_button) {
                        mListDataChild.get(getGroup(groupPosition)).get(childPosition).setAnswer("Neutral");
                    //    mViewHolder.mCommentlayout.setVisibility(View.GONE);
                    } else if (checkedId == R.id.on_button) {
                        mListDataChild.get(getGroup(groupPosition)).get(childPosition).setAnswer("Yes");
                     //   mViewHolder.mCommentlayout.setVisibility(View.GONE);
                    }
                    notifyDataSetChanged();
                }
            });


           /* mViewHolder.mComment.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                   if(!hasFocus){
                     //  final int position = (Integer)v.getTag();
                       final EditText Caption = (EditText) v;
                       String text = Caption.getText().toString();
                       mViewHolder.mComment.setText(text);
                   }
                }
            });*/
            mViewHolder.mSubmit.setTag(mViewHolder);
            mViewHolder.mSubmit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if(mViewHolder.mCancel.getVisibility()==View.VISIBLE){
                        mViewHolder.mCancel.setVisibility(View.GONE);

                    }

                    mViewHolder.mSubmit.setVisibility(View.GONE);
                   //mSubmit.setVisibility(View.GONE);
                    mViewHolder.mEdit.setVisibility(View.VISIBLE);

                    notifyDataSetChanged();
                }
            });
            mViewHolder.mEdit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                   // mSubmit.setVisibility(View.GONE);
                }
            });
        }
        return convertView;
    }


    @Override
    public int getChildrenCount(int groupPosition) {

        return mListDataChild.get(mListDataHeader.get(groupPosition)).size();
    }

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

    @Override
    public int getGroupCount() {
        return this.mListDataHeader.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.mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.task_list_parent,parent, false);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.eventsListEventRowText);
        lblListHeader.setTextColor(mContext.getResources().getColor(R.color.black));
        lblListHeader.setText(headerTitle);

        return convertView;
    }

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

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

    @Override
    public int getChildType(int groupPosition, int childPosition) {
        int result=1;
        if(mListDataChild.get(getGroup(groupPosition)).get(childPosition).getType()==0){
            result=0;
        }
        return result;
    }

    @Override
    public int getChildTypeCount() {
        return 2;
    }

    private static class MyViewHolder {
        TextView TaskName;
        SegmentedRadioGroup segmentImg;
        RelativeLayout mCommentlayout;
        ImageView mSubmit,mCancel,mEdit;
        EditText mComment;

    }

    public ArrayList<Answer> submitList(){
        ArrayList<Answer> result =new ArrayList<>();
        result.clear();
        for(int i=0;i<mListDataChild.size();i++){
            for(int j=0;j<mListDataChild.get(getGroup(i)).size();j++){
                if(mListDataChild.get(getGroup(i)).get(j).getQueryId()!=-1){
                    result.add(new Answer(mListDataChild.get(getGroup(i)).get(j).getQueryId(),mListDataChild.get(getGroup(i)).get(j).getAnswer(),mListDataChild.get(getGroup(i)).get(j).getComment()));
                }
            }
        }
        return result;
    }



}

我缺少什么 here.this 行变得空

if(mViewHolder.mCancel.getVisibility()==View.VISIBLE){

谢谢

您需要先获取ViewHolder实例。 在 getView() 内 return 之前 convertView 做:

mViewHolder.mSubmit.setTag(mViewHolder);

然后你就可以随意取回了:

mViewHolder.mSubmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ViewHolder mViewHolder = (ViewHolder)v.getTag();
            if(mViewHolder.mCancel.getVisibility()==View.VISIBLE){
                mViewHolder.mCancel.setVisibility(View.GONE);

            }

            mViewHolder.mSubmit.setVisibility(View.GONE);

            notifyDataSetChanged();
        }
    });

编辑:

您的代码存在一些大问题。最大的一个是您只有一个 ViewHolder 的实例,而不是 Adapter.

的每个 View 的实例

此外,每次调用 getChildView() 时,您都会一次又一次地创建 LayoutInflater,而不是在 Adapter.

中创建一次

此外,您在 getChildView() 的每个 运行 分配监听器,这也需要在 inflation 中按时完成。

另外这一行:

 mViewHolder.TaskName = (TextView) convertView.findViewById(R.id.eventsListEventRowText);

需要在 inflation.

总而言之,您的代码需要看起来像这样(只是更改了方法):

public class DailyTaskExpandableAdapter extends BaseExpandableListAdapter {

private Context mContext;
private List<String> mListDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String, List<ListTypeModel>> mListDataChild;
LayoutInflater infalInflater;

public DailyTaskExpandableAdapter(Context context, List<String> listDataHeader,
                                  HashMap<String, List<ListTypeModel>> listChildData) {
    this.mContext = context;
    this.mListDataHeader = listDataHeader;
    this.mListDataChild = listChildData;
    infalInflater = (LayoutInflater) this.mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getChildView(final int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {
    MyViewHolder mViewHolder = null;
    int itemType = getChildType(groupPosition, childPosition);

    if (convertView == null) {
        switch (itemType) {
            case 0:
                convertView = infalInflater.inflate(R.layout.task_list_subhead_row, parent, false);
                mViewHolder = new MyViewHolder();
                mViewHolder.TaskName = (TextView) convertView.findViewById(R.id.eventsListEventRowText);
                convertView.setTag(mViewHolder);
                break;
            case 1:
                convertView = infalInflater.inflate(R.layout.task_list_comment_row, parent, false);
                mViewHolder = new MyViewHolder();
                mViewHolder.segmentImg = (SegmentedRadioGroup) convertView.findViewById(R.id.segment_img);
                mViewHolder.mCommentlayout = (RelativeLayout) convertView.findViewById(R.id.comment_layout);
                mViewHolder.mComment = (EditText) convertView.findViewById(R.id.comment);
                mViewHolder.mCancel = (ImageView) convertView.findViewById(R.id.cancel);
                mViewHolder.mSubmit = (ImageView) convertView.findViewById(R.id.submit);
                mViewHolder.mEdit = (ImageView) convertView.findViewById(R.id.edit);
                mViewHolder.TaskName = (TextView) convertView.findViewById(R.id.eventsListEventRowText);
                mViewHolder.segmentImg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(RadioGroup group, int checkedId) {
                        if (checkedId == R.id.off_button) {
                            mListDataChild.get(getGroup(groupPosition)).get(childPosition).setAnswer("No");
                        } else if (checkedId == R.id.neutral_button) {
                            mListDataChild.get(getGroup(groupPosition)).get(childPosition).setAnswer("Neutral");
                            //    mViewHolder.mCommentlayout.setVisibility(View.GONE);
                        } else if (checkedId == R.id.on_button) {
                            mListDataChild.get(getGroup(groupPosition)).get(childPosition).setAnswer("Yes");
                            //   mViewHolder.mCommentlayout.setVisibility(View.GONE);
                        }
                        notifyDataSetChanged();
                    }
                });
                mViewHolder.mSubmit.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        MyViewHolder mViewHolder = (MyViewHolder) ((View)v.getParent()).getTag(); //you need to access the convertView that hold this Tag inside
                        if (mViewHolder.mCancel.getVisibility() == View.VISIBLE) {
                            mViewHolder.mCancel.setVisibility(View.GONE);

                        }
                        mViewHolder.mSubmit.setVisibility(View.GONE);
                        //mSubmit.setVisibility(View.GONE);
                        mViewHolder.mEdit.setVisibility(View.VISIBLE);
                        notifyDataSetChanged();
                    }
                });
                mViewHolder.mEdit.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        // mSubmit.setVisibility(View.GONE);
                    }
                });
                convertView.setTag(mViewHolder);
                break;
        }
    } else {
        mViewHolder = (MyViewHolder) convertView.getTag();
    }

    //the repopulation:
    mViewHolder.TaskName.setText(mListDataChild.get(getGroup(groupPosition)).get(childPosition).getTask().toString());

    if (itemType == 1) {
        if (mListDataChild.get(getGroup(groupPosition)).get(childPosition).getAnswer().equals("No"))
            mViewHolder.segmentImg.setBackgroundResource(R.drawable.off_button);
        else if (mListDataChild.get(getGroup(groupPosition)).get(childPosition).getAnswer().equals("Yes"))
            mViewHolder.segmentImg.setBackgroundResource(R.drawable.on_button);
        else
            mViewHolder.segmentImg.setBackgroundResource(R.drawable.neutral_button);

        if (!mListDataChild.get(getGroup(groupPosition)).get(childPosition).getAnswer().equals("No")) {
            mViewHolder.mCommentlayout.setVisibility(View.GONE);

        } else {
            mViewHolder.mCommentlayout.setVisibility(View.VISIBLE);
            mViewHolder.mCancel.setVisibility(View.VISIBLE);
            mViewHolder.mSubmit.setVisibility(View.VISIBLE);

        }
    }
    return convertView;
}

}