마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ListView의 getChildAt가 null값이 나옵니다 (밑에 질문 소스 추가분입니다.)

0 추천
lvSWFList.setOnItemClickListener(new AdapterView.OnItemClickListener() {                    
            @Override
            public void onItemClick(AdapterView parent, View v, int position, long id) {
                    AppDefines.nConfigIdx = position;                                               
                    Context context = MainActivity.this;
                    LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
                    final View layout = inflater.inflate(R.layout.custom_dialog_popup, (ViewGroup) findViewById(R.id.layout_popup_bg));
                    AlertDialog.Builder adBuilder = new AlertDialog.Builder(MainActivity.this);
                    adBuilder.setView(layout);
                    mCustomDialog = adBuilder.create();
mCustomDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    mCustomDialog.setCancelable(false);
                    mCustomDialog.show();
                    ((TextView) layout.findViewById(R.id.tv_control_sts)).setText("장치명");
                    ((TextView) layout.findViewById(R.id.tv_popup_powertarget)).setText("장치명");

                    ListViewItem mData = adapterSWF.listViewItemArr[AppDefines.nConfigIdx];
                    final Button btnOK = ((Button) layout.findViewById(R.id.btn_popup_ok));
                    btnOK.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            String tmp = ((EditText) layout.findViewById(R.id.et_popup_powertarget)).getText().toString();      
                            ListViewItem mData = adapterSWF.listViewItemArr[AppDefines.nConfigIdx]; 
                            if (tmp.length() < 1) {                                                 
                                tmp = (String) editText.getHint();                                  
                            }
                           
                            mData.setTitle(tmp);                                                    
                            int firstVisiblePosition = lvSWFList.getFirstVisiblePosition();       
                            Log.d("Lee", String.valueOf(lvSWFList.getChildAt(AppDefines.nConfigIdx - firstVisiblePosition)));

                            View view = lvSWFList.getChildAt(AppDefines.nConfigIdx - firstVisiblePosition); 
                            TextView tvTitle = (TextView) view.findViewById(R.id.textView1);        
                            tvTitle.setText(tmp);                                                   
                            mCustomDialog.dismiss();                                                
                            mCustomDialog = null;
                            makeToastMsg("장치명이 변경되었습니다.");
                        }
                    });
lvSWFList.getChildAt(AppDefines.nConfigIdx - firstVisiblePosition)

이 부분에서 파라미터가 5~8일 때만 null값이 나옵니다.

다른 인덱스일 때는 제대로 나오구요

해당 인덱스의 list 아이템도 있구요

동기식 처리인데... 어떤 문제일까요?

zenojm (2,840 포인트) 님이 2017년 8월 18일 질문
getCount는 리스트뷰에 있는 아이템 갯수 그대로 나오는데 (12개)
getChildCount는 4개로 나옵니다..

1개의 답변

+1 추천
 
채택된 답변
당연히 다르죠.

AdapterView는 아이템뷰를 재사용해요. 그래서 화면에 보이는 아이템이 4개 밖에 없기 때문에 getChildCount를 해도 4밖에 안되는거에요.

코드 보니까 리스트 뷰 데이터 변경을 해주시고 싶어 하는것 같은데, 그럴려면 Adapter에서 가지고 있는 데이터를 변경해주신 다음에 Adapter.NotifyDataSetChagned()를 호출하시는게 올바른 방법입니다.
갈무리 (12,430 포인트) 님이 2017년 8월 18일 답변
zenojm님이 2017년 8월 18일 채택됨
화면에 보이는 listview안의 아이템은 12개예요..
헌데 childcount가 4개가 나오더라구요
그래서 5이상의 아이템을 getchildat하면 null값이 나오구요...
말씀하신 방법대로 하는게 제일 이상적이네요
아무래도 제가 listview쪽을 더 공부를 해야겠습니다.
도움주셔서 감사해요!
...