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

.notifyDataSetInvalidated(); 이 메소드가 실행이 안됩니다...

0 추천
메인 보시면 OnitemLongClick()이 메소드가 삭제하는 메소드인데 .notifyDataSetInvalidated() 요게 실행이 안되는 것 같아요 삭제할려고 누르면 어플이 꺼지고 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 요 에러가 뜨는데 배열인덱스 문제인 건 알겠고 먼저 아이템을 지워서 아이템이 없기 때문에 그런 것 같은데 이거 어떻게 해결을 하면 될까여 ???

public class MainActivity extends AppCompatActivity implements Adapter.ListBtnClickListener , AdapterView.OnItemLongClickListener{
        final int INTENT_REQUEST = 1;//인텐트(option 신호값)
        private ListView m_oListView = null;//리스트뷰를 넣기 위한 변수
        private ArrayList<item> list_item = new ArrayList<>();//item 배열
     item item_list;
    Adapter oAdapter;
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button btn1 = (Button) findViewById(R.id.btn1);//버튼
            View sss = getLayoutInflater().inflate(R.layout.list_item, null, false);
            ImageButton img = sss.findViewById(R.id.imb2);
         btn1.setOnClickListener(new View.OnClickListener() {//+버튼클릭 리스너

                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(getApplicationContext(), option.class);//클릭하면 옵션 액티비티로 넘어감
                    startActivityForResult(intent, INTENT_REQUEST);
                }
            });


        }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {//옵션 액티비티 결과 수신
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == INTENT_REQUEST && resultCode == AppCompatActivity.RESULT_OK) {//신호가 ok이고 인텐트 번호가 맞다면

                String name = data.getStringExtra("name");//이름 번호 가져오기
                String number = data.getStringExtra("phone");

              item_list = new item();
                item_list.name = name;
                item_list.number = number;
                list_item.add(item_list);
                //가져온 이름 번호를 아이템객체에 넣기
            }
                oAdapter = new Adapter(list_item, getApplication(), this, R.layout.list_item);//어댑터 객체 생성

                m_oListView = (ListView) findViewById(R.id.list);//리스트뷰 연결
                m_oListView.setAdapter(oAdapter);//어댑터 장착
                m_oListView.setOnItemLongClickListener(this);


        }

    @Override
    public void onListBtnClick(int i) {


    }
    @Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {//길게 클릭하면 삭제하는 버튼
        list_item.remove(i);
        oAdapter.notifyDataSetInvalidated();
        return false;
    }


}



 
달려갑니다 (280 포인트) 님이 2019년 11월 1일 질문
public class Adapter extends BaseAdapter {

    //BaseAdapter 상속

    public interface ListBtnClickListener {//버튼 클릭 이벤트를 위한 리스너 인터페이스 정의

        void onListBtnClick(int i);
    }

    int resourceId;

    private ListBtnClickListener listBtnClickListener;//생성자로부터 전달된 버튼클릭리스너 저장

    LayoutInflater inflater = null;//xml에 정의된 자원들을 뷰의 형태로 반환
    public  ArrayList<item> m_oData;//item 클래스에 대한 어레이 배열 생성
    private int nListCnt;
    Context com;

    public Adapter(ArrayList<item> _oData, Context com, ListBtnClickListener clickListener, int resource) {//ArrayList<item>의 배열의 데이터를 m_oData변수에 넣기
        m_oData = _oData;
        nListCnt = m_oData.size();//사이즈
        this.com = com;
       this.listBtnClickListener = clickListener;
        this.resourceId = resource;
    }


    @Override
    public int getCount() {//아이템이 몇개 그려지는
        return nListCnt;
    }//배열의 사이즈 반환

    @Override
    public Object getItem(int i) {
        return i;
    }//아이템이 어느 인덱스에 있는지 확인

    @Override
    public long getItemId(int i) {
        return i;
    }//아이템 뷰의 아이디를 리턴

    @Override
    public View getView(final int i, View view, final ViewGroup viewGroup) {//목록의 화면 처리를 담당

        if (view == null) {//만약 화면이 안보인다면
            final Context context = viewGroup.getContext();//뷰그룹의 화면값을 가져온다
            if (inflater == null) {//레이아웃인필터가 없을 때 즉 xml자원이 뷰의 형태로 없을 떄
                inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//인필터값이 없다면 그 자원들을 뷰의 형태로 반환
            }
            view = inflater.inflate(R.layout.list_item, viewGroup, false);//xml로 정의된 뷰를 객체화 시킴
        }
        final TextView name = (TextView) view.findViewById(R.id.text1);//이름 가져옴
        final TextView number = (TextView) view.findViewById(R.id.text2);//번호 가져옴
        ListView list = view.findViewById(R.id.list);

        name.setText(m_oData.get(i).name);//이름을 텍스트로 가져옴


        number.setText(m_oData.get(i).number);//번호를 텍스트로 가져옴

        ImageButton img = view.findViewById(R.id.imb2);
        img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                PermissionListener permissionlistener = new PermissionListener() {
                    @Override
                    public void onPermissionGranted() {//권한허가일경우
                        Toast.makeText(com, "권한 허가", Toast.LENGTH_SHORT).show();


                        Intent callIntent=new Intent();
                        callIntent.setAction(Intent.ACTION_CALL);//통화액션
                        callIntent.setData(Uri.parse("tel:" + m_oData.get(i).number));//번호저장
                        com.startActivity(new Intent(callIntent).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

                    }

                    @Override
                    public void onPermissionDenied(ArrayList<String> deniedPermissions) {//권한이 거부가 됐을 경우
                        Toast.makeText(com, "권한 거부\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
                    }


                };


                TedPermission.with(com)

                        .setPermissionListener(permissionlistener)
                        .setRationaleMessage("전화걸기에는 전화권환설정이 필요해요")
                        .setDeniedMessage("왜 거부하셨어요...\n하지만 [설정] > [권한] 에서 권한을 허용할 수 있어요.")
                        .setPermissions(Manifest.permission.CALL_PHONE)
                        .check();


            }

        });

        return view;

    }

}
요거는 커스텀리스트뷰 입니다... 여기 코드가 문제인가여....

1개의 답변

0 추천

notifyDataSetChanged()로 바꿔보세요.

http://www.androidstudy.co.kr/bbs/board.php?bo_table=C09&wr_id=26

익명사용자 님이 2019년 11월 2일 답변
아이고 이것저것 하다보니  캡처를 잘 못 찍었습니다 말씀하신 그 메소드도 햇었습니다 안되더군요 ㅠ
...