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

리스트뷰의 내용이 홈버튼으로 나갔다가 들어오면 복제가 됩니다 ㅜㅜ

0 추천

 

 

몇 일째 해결하려는데 해결이 안됩니다 도와주세요...ㅜㅜ....

코드가 길어서 메모장으로 첨부할게요 한번만 봐주실분 부탁드립니다 정말 도와주세용..

 

 protected void onStart(){
        super.onStart();
        numOfSuccess=0;
        numOfItem=0;
        Log.d("요청", "요청입니다.");
        SQLiteDatabase db;
        DatabaseHelper dbHelper;
        dbHelper = new DatabaseHelper(getApplicationContext());
        db = dbHelper.getWritableDatabase();
        String TABLE_NAME = "item";
        Cursor c1 = db.rawQuery("select name, period, count,alarm from " + TABLE_NAME, null);
        while (c1.moveToNext()) {
            Item objItem = new Item(c1.getString(0),c1.getString(1),c1.getString(2),c1.getString(3));
            if(c1.getString(3).compareTo("yes")==0)numOfSuccess++;
            todayWorkList.add(objItem);
        }
        numOfItem=todayWorkList.size();
        SharedPreferences aa=getSharedPreferences("aa",0);
        SharedPreferences.Editor editor=aa.edit();
        editor.putInt("first",numOfItem);
        editor.putInt("second",numOfSuccess);
        editor.putInt("third",numOfItem-numOfSuccess);
        c1.close();
        achievePercent=(double)numOfSuccess/numOfItem;
        achievePercent=achievePercent*100;
        progress.setProgress((int)achievePercent);
        int a=(int)achievePercent;
        editor.putInt("four",a);
        editor.commit();
        String s=String.valueOf(a);
        String b=new String("달성률:"+s+"%");
        showPercent.setText(b);
        /*
        if(achievePercent>=0&&achievePercent<30){change.setBackgroundResource(R.drawable.start);   }
        else if(achievePercent>=30&&achievePercent<50){change.setBackgroundResource(R.drawable.start1);
        }
        else if(achievePercent>=50&&achievePercent<80){change.setBackgroundResource(R.drawable.start2);
        }
        else if(achievePercent>=80){change.setBackgroundResource(R.drawable.start3);
        }*/
        if(a>=0&&a<30){change.setBackgroundResource(R.drawable.start);   }
        else if(a>=30&&a<50){change.setBackgroundResource(R.drawable.start1);
        }
        else if(a>=50&&a<80){change.setBackgroundResource(R.drawable.start2);
        }
        else if(a>=80){change.setBackgroundResource(R.drawable.start3);
        }
        adapter.notifyDataSetChanged();
    }

 

 

홈버튼 갔다가 들어오면 onstart가 다시 호출 되는거 같아서 여기에서 adapter.notifyDatasetChanged를

지우면은 복제되는 현상은 없어지지만 리스트뷰 아이템을 클릭했을때 adapter.notifyDatasetChanged

메소드가 없다고 어플이 꺼지더라구요 하....

 

 

익명사용자 님이 2017년 6월 1일 질문

3개의 답변

0 추천
onStart할때마다 DB에서 데이터 긁어와서 어댑터에다가 채워주는식인거 같은데

매번 데이터가 누적되서 그런거 같은데

어댑터에 데이터(아마 리스트로 하셨겠죠?) 관리하는 객체를 clear()해주시던지, onstart에서 데이터를 그만 넣던지 하시면 될거 같네요
Charlesz (4,420 포인트) 님이 2017년 6월 1일 답변
와 진짜 감사합니다 여러분들 덕분에 해결했어요 너무 감사합니다

진짜 감사해요 클리어하니까 됬어요 ㅎㅎㅎ
0 추천
onstart() 메서드는 생명주기 상에서 액티비티가 처음실행후 oncreate()다음에 실행이 되고 백그라운드에 갔다가 다시 화면에 표시될때에도 onstart()메서드가 호출되게 됩니다.

 

따라서 해당코드가 질문하신 방식대로 다시 호출되게 하지 않게 위해서는 oncreate()안에 코딩해 보시는게 해결책이 되실것 같네요. 안드로이드 생명주기 공부해보시는게 좋을것 같아요
시공조아 (1,650 포인트) 님이 2017년 6월 1일 답변
와 진짜 감사합니다 여러분들 덕분에 해결했어요 너무 감사합니다
ㅠㅠ
0 추천

다른분 답변처럼 생명주기부터 보시는게 좋을것 같고요.

 

onstart에서 할 수 밖에 없는 구조라면, todayWorkList 를 초기화 후 저장하는 작업을 하시면 될 것 같네요.

이건 onstart뿐만아니라 어느 경우에도 선행해야될 사항입니다.

 

개발자초심 (21,220 포인트) 님이 2017년 6월 1일 답변
와 진짜 감사합니다 여러분들 덕분에 해결했어요 너무 감사합니다
...