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

안드로이드 어플리케이션 개발중 어플리케이션이 중지 현상

0 추천

디버깅 한 결과

로그켓은

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.lg.jangttok4application, PID: 18613
                  java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
                      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                      at java.util.ArrayList.get(ArrayList.java:308)
                      at com.example.lg.jangttok4application.ListActivity$2.onClick(ListActivity.java:93)
                      at android.view.View.performClick(View.java:4633)
                      at android.view.View$PerformClick.run(View.java:19270)
                      at android.os.Handler.handleCallback(Handler.java:733)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:146)
                      at android.app.ActivityThread.main(ActivityThread.java:5602)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:515)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
                      at dalvik.system.NativeStart.main(Native Method)

이런 오류가 납니다.

버튼클릭을 하면 다른 엑티비티로 넘어가는 과정입니다.

넘겨주는 String 값과 함께 넘어가서 웹뷰를 실행시켜 String 값을 사용하는 부분 인데 코딩도 올리겠습니다.

//터치한 리스트의 값을 하나씩 저장하는 배열
final ArrayList<String> brigde = new ArrayList<String>();

//adapter 생성
final ItemListAdatper adapter = new ItemListAdatper();

//리스트뷰 참조 및 Adapter 담기
final ListView listview = (ListView) findViewById(R.id.listView);
listview.setAdapter(adapter);

//리스트뷰에 보여질 아이템들 추가
adapter.addItem("김치" , "17-3-10", "17-3-17", "D-7");
adapter.addItem("우유" , "17-3-10", "17-3-24", "D-14");
adapter.addItem("케찹" , "17-3-10", "18-3-9", "D-365");
adapter.addItem("계란" , "17-3-1", "17-3-24", "D-23");


//위에서 생성한 listview에 클릭 이벤트 핸들러 정의
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        //get item
        Items item = (Items) parent.getItemAtPosition(position);
        //가져온 item_name을 변수 name에 저장
        //String name = item.getItem_name();

        brigde.add(item.getItem_name());//가져온 item_name을 ArrayList에 저장

        //여기에 단어 검색 구현 name 정보가지고
        //Toast.makeText(ListActivity.this, name, Toast.LENGTH_SHORT).show();//토스트로 출력시킴

    }
});
Button searchbtn = (Button) findViewById(R.id.searchbtn);
searchbtn.setOnClickListener(new Button.OnClickListener(){
    public void onClick(View v){

        SparseBooleanArray checkedItems = listview.getCheckedItemPositions();
        ArrayList<String> temp = new ArrayList<String>();//배열 brigde에 저장된 값들중 체크된 값들만 저장하는 배열

        int count = adapter.getCount();//리스트에 보여지는 목록들의 개수
        String address = "https://search.naver.com/search.naver?where=post&sm=tab_jum&ie=utf8&query=";//검색할 사이트 주소 저장

        for (int i = 0; i < count; i++) {
            if (checkedItems.get(i) == true && brigde.get(i) != null) {
                temp.add(brigde.get(i));//체크된 값들만 찾아 새로운 배열에 삽입
            }
        }

        for(int i = 0 ; i < temp.size() ; i++){
            address = address + "+" + temp.get(i);
        }

        address = address + "+" + "레시피";//사이트 주소 + 재료명 + 레시피 의 형태를 다시 저장함.

        Intent intent =  new Intent(ListActivity.this, WebSearchActivity.class);
        intent.putExtra("address", address);//아이템의 값들중 address의 정보를 WebSearch 액티비티로 넘김
        startActivity(intent);//intent 시작

        listview.clearChoices() ;
        adapter.notifyDataSetChanged();
    }
});
겸이태 님이 2017년 3월 24일 질문

1개의 답변

0 추천
adapter 와 bridge 는 서로 갯수가 틀릴 수 있습니다.

그런데 adapter 갯수만큰 돌리면서 bridge 에서 get() 하시면 인덱스가 넘어가서 오류가 발생할 수 있습니다.
바램 (19,650 포인트) 님이 2017년 3월 24일 답변
감사합니다 ^^
몇가지 질문 더 하겠습니다.
다중선택 리스트뷰 에서 체크된 리스트가 뭔지는 알겠는데 그 리스트안에 있는 값들 을 사용하고 싶은데 방법이 없을까요 ?
onClick()의 첫번째 for문을 아래와 같이 바꿔보세요.


    for (int i=0; i < checkedItems.size(); i++){
 
        if (checkedItems.valueAt(i)) {
            int idx = checkedItems.keyAt(i);
 
 
            temp.add(adapter.getItem(idx).getItem_name());
        }
    }
이틀동안 고민하던 문제가 사라졌습니다 ..
감사합니다!!
...