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

안드로이드 스튜디오 다른 클래스의 arraylist를 리스트뷰에 넣기

0 추천

DBHelper를 통해서 arraylist를 만들어서 mainActivity의 listview에 값으로 넣으려고 합니다.

그래서 만들어서 실행했는데 다음과 같은 오류가 납니다.

뭐가 문제인지 모르겠습니다... 도와주세요..(전체 코드는 댓글에 남겨두겠습니다.)

<logcat>

Caused by: java.lang.ClassCastException: com.example.mytest.WorkList cannot be cast to java.util.List
        at com.example.mytest.MainActivity.onResume(MainActivity.java:149)
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1456)
        at android.app.Activity.performResume(Activity.java:8344)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4854)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4901) 
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.app.ActivityThread.main(ActivityThread.java:8512) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) 

 

해당 구문

Adapter = new ArrayAdapter<String>(this , activity_list_item, (List<String>) WorkListinfo);
(330 포인트) 님이 2021년 6월 22일 질문

2개의 답변

0 추천
 
채택된 답변

ArrayList대신에 interface type인 List를 리턴하는 것이 좀 더 나은 코드입니다.

정확하게 어떤 데이터를 어댑터에 넣으시려고 하는지는 모르겠지만, 아래처럼 한번 해보세요.

public List<WorkList> getWorkList() {
   ...
}


 @Override
    protected void onResume() {
        super.onResume();

        fetchWorkList();
        
    }

private DBHelper dbHelper;

private void fetchWorkList() {
    if (dbHelper == null) {
       dbHelper = new DBHelper(this);
   } 
        
   SQLiteDatabase db = dbHelper.getWritableDatabase(); //???

   List<WorkList> workList = helper.getWorkList();
   ArrayAdapter<WorkList> addapter = new ArrayAdapter<>(this , activity_list_item, workList);
   main_ScrollList.setAdapter(Adapter);

   db.close(); //???
}

만약 ArrayAdapter에 String만 필요하시면 workList에서 원하시는 String field만 축출하셔서 사용하셔야 해요.

spark (224,800 포인트) 님이 2021년 6월 22일 답변
spark님이 2021년 6월 22일 수정
감사합니다 ㅠㅠ 독학이라 검색하면서 했더니 필요없는것도 들어가고 그랬네요 알려주셔서 감사합니다 ㅠㅠ
참고로, ???부분은 불필요한게 아니라 onResume때마다 매번 호출되므로 비효율적으로 보입니다. 보통 db는 application내에서 한번 열어놓고 사용하는 경우가 많은 걸로 생각됩니다. 왜냐하면 db를 열고 닫는 작업은 상대적으로 고비용이 들어가는 작업이기 때문입니다. ArrayAdapter도 마찬가지로 일반적으로는 한번만 생성하고 item만 업데이트하고 notifyDatasetChanged()같은 메소드를 호출해서 업데이터 합니다.
헉 그렇군요!! 알려주셔서 너무 감사합니다 ㅠㅠ!!!
0 추천

onResume() 에서

Adapter = new ArrayAdapter<String>(this , activity_list_item, (List<String>) WorkListinfo);

저 부분에서 클래스 캐스팅 오류 인듯합니다.

익명사용자 님이 2021년 6월 22일 답변
...