본문 바로가기

IT/Android

[Android] 커스텀 어댑터 사용하여 ListView 버튼달기 및 갱신 notifyDataSetChanged?




화면구성입니다. 기본적인 레이아웃 만드는건 생략하도록 하겠습니다.

이글의 핵심 내용은 커스텀 버튼이있는 리스트뷰를 커스텀어댑터를 사용하여 표시합니다.

리스트뷰의 버튼들이 들어가있는데 이 이벤트를 어찌 처리할꼬? 처리하였는대 갱신이 안되네?를 해결해보겠습니다.

 

아래 코드는 약간의 버그를 가지고있습니다. 그대로따라하지 마시고 이런 방식으로 할 수 있다. 라는것으로 참조하세요.

 

MainActivity.class

 

        //myAdapter를 사용하여 list표시

        myAdapter = new MyAdapter(this, R.layout.mainwelramlist, welarmDTO.getSelectList());

        listView.setAdapter(myAdapter);

 

 

 

myadapter에 세팅을 해줍니다.

 

MyAdapter.class

  

@Override

    public View getView(int position, View convertView, ViewGroup parent) {

        final String welarmNo;

        // 리스트뷰 갯수만큼 실행되므로 반복성에 주의해야한다

        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) context

                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = inflater.inflate(itemLayout, parent, false);

 

            // 메인리스트 - TextView(name)

            TextView textView = (TextView) convertView

                    .findViewById(R.id.welarmMaintextViewList);

            Map welarmDTOMap = (Map) list.get(position);

 

            // 텍스트뷰 텍스트 세팅

            String getText = welarmDTOMap.get("name").toString();

            textView.setText(getText);

 

            // 텍스트뷰 테그 세팅

            textView.setTag(welarmDTOMap.get("welarmNo").toString());

            welarmNo = welarmDTOMap.get("welarmNo").toString();

 

            // onOff메시지

            Button button = (Button) convertView.findViewById(R.id.welarmMainListOnOff);

            if (welarmDTOMap.get("state").equals("1")) {

                button.setText("on");

            } else {

                button.setText("off");

            }

 

            // 메인리스트 - 수정버튼

            Button OptionButton = (Button) convertView.findViewById(R.id.welarmMainListOption);

            OptionButton.setOnClickListener((OnClickListener)context);

            OptionButton.setTag(welarmDTOMap.get("welarmNo").toString());

 

            // 메인리스트 - On/Off버튼

            Button onOffButton = (Button) convertView.findViewById(R.id.welarmMainListOnOff);

            onOffButton.setOnClickListener((OnClickListener)context);

            onOffButton.setTag(welarmDTOMap.get("welarmNo").toString());

           

            // 메인리스트 - 식제버튼

            Button deleteButton = (Button) convertView.findViewById(R.id.welarmMainListDelete);

            deleteButton.setOnClickListener((OnClickListener)context);

            deleteButton.setTag(welarmDTOMap.get("welarmNo").toString());

 

        }

 

        return convertView;

    }

 

 

버튼을 만들어서 리스너를 달아주는데 구현은 MainActivity에서 할겁니다. context MainActivity context입니다.

Tag! 메모를 달아서 전달할 수 있습니다.

 

 

MainActivity.class List내부에 버튼을 클릭하면 MainActivity에서 정의한 onClick가 호출된다.

 

@Override

    public void onClick(View v) {

       

        Log.d("MainActivity OnClick테스트", "test: vid:"+v.getId()+"tag:"+v.getTag());

       

        //추가버튼 switch로 바꾸도록

        switch(v.getId()){

            case R.id.welarmAddButton:

                Intent i = new Intent(this, AddWelarmActivity.class);

                startActivity(i);

                break;


            case R.id.welarmMainListOption:

                buttonAction.welarmListModifyButton(this, v.getTag().toString());

                onResume();

                break;


            case R.id.welarmMainListOnOff:

                buttonAction.welarmListOnOff(this, v.getTag().toString());

                myAdapter.notifyDataSetChanged();

                Log.d("MainActivity.class", "test: myAdapter_switch:"+myAdapter);

                onResume();

                break;


            case R.id.welarmMainListDelete:

                //알람삭제

                UpdateFrequence updateFrequence = new UpdateFrequence();

                updateFrequence.deleteAlarm(this, v.getTag().toString());

                buttonAction.welarmListDeleteButton(this, v.getTag().toString());

                myAdapter.notifyDataSetChanged();

                onResume();

                break;


            default:

                break;

        }

    }

 


호출되는 버튼ID에 따라서 switch문이 실행됩니다. case문마다 myAdapter메소드의 notifyDataSetChanged를 사용하려면 어댑터에 집어넣은 list목록에 변화가 있어야 합니다.


 제가 만드는어플에선 그딴건 없으므로 어떤 버튼을 누르던지 onResume()을 다시 호출하여화면을 새로고칩니다.