안드로이드 개발 질문/답변
(글 수 45,052)
후.. 밤샜습니다. ㅜㅜ
졸작이 목요일날 발표인데 큰일 났네요ㅜㅜ
선배 개발자님들의 조언을 구하고자 이렇게 글을 남깁니다.
지금 프로젝트 내 java파일은 메인 액티비티, 리스트뷰의 아이템, 리스트뷰 어댑터, 사용자 정의 뷰 이렇게 되어 있습니다.
제목 대로 메인 액티비티의 리스트뷰 아이템 클릭 리스너에서 정의 뷰의 인스턴스를 만들어 instance.invalidate();
이렇게 해주고 있는데, 최초에만 onDraw()되고, 리스트뷰의 아이템을 클릭 할 시에는 다시 onDraw()되지 않습니다 ㅜㅜ
좀 도와주시면 정말 감사드리겠습니다. 정말로요!!! ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
너무 급하고 소스 코드 첨부하는 법을 잘 몰라서, 하드 카피로 중요한 부분만 넣겠습니당 ㅜㅜ
public class DrawActivity extends Activity {
private static final String TAG = "myProject";
HorizontalListView list = null;
ArrayList<FlowerItem> data = null;
FlowerAdapter adapter = null;
public static Bitmap bitmapImg = null; //DrawView에서 사용해서 스태틱으로..
public static boolean clickFLAG = false; //DrawView에서 사용해서 스태틱으로..
.................중략..............
AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parentView, View view, int position,
long id) {
Log.v(TAG, "position : " + position + "\nid : " + id);
Toast.makeText(DrawActivity.this, data.get(position).getName(),
Toast.LENGTH_SHORT).show();
//리스트뷰에 있는 아이콘의 아이디를 통해서 BitmapDrawable(드로우어블)객체 생성.
BitmapDrawable drawable = (BitmapDrawable)
getResources().getDrawable(data.get(position).getIcon());
Bitmap bitmap = drawable.getBitmap(); //드로우어블객체를 비트맵객체로.
bitmapImg = Bitmap.createBitmap(bitmap); //메모리에 그려줌.
clickFLAG = true;
Log.v(TAG, "onItemClick, clickFLAG : " + clickFLAG);
DrawView v = new DrawView(getBaseContext());
v.invalidate(); //invalidate()로 다시 onDraw()해야할 필요가 있음.
}
};
public class DrawView extends View {
private static final String TAG = "myProject";
private Paint paint = new Paint();
................중략.............
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.v(TAG, "onDraw메소드, clixkFLAG : " + kr.co.kywpcm.myflowerproject.DrawActivity.clickFLAG);
//클릭플래그가 true일 때만(리스트뷰의 아이템이 클릭 되었을 때만) 그려줌.
if(kr.co.kywpcm.myflowerproject.DrawActivity.clickFLAG){
canvas.drawBitmap(kr.co.kywpcm.myflowerproject.DrawActivity.bitmapImg,
100, 100, paint);
}
}
}
안녕하세요. 잘부탁드립니다~
2012.11.01 20:47:27
음.. 늦게 다시 봤네요..
제가 경험했던거랑 비슷한 건지는.. 잘 모르겠네요.. ^^; 코드 중략인지라
도움이 되실지는 모르겠지만 제 경험을 바탕으로 원인을 예측해보자면
혹시 터치후에 리스트뷰를 위아래로 스크롤 했을 때서야 그린 아이템의 그림이 갑자기 툭 바뀌지 않던가요?
그렇다면 그 아이템 안의 DrawView만 invaliate() 하시지 마시고
그 아이템이 속해 있는 ListView도 invaliate()해보셔요
즉 쉽게 말해서 안에 있는 아이템만 달랑 invaliate() 호출하지 마시고 list.invaliate()를 호출해서 ListView 전체를 다시 그려보셔요
커스텀 뷰가 어디에 붙어 있는 건가요?
그걸 알아야지 뭘 좀 알겄는데..
걍 예상해 보면.. 두가지
1.뷰를 생성하시고 붙이지 않으셧거나
2.리스트뷰의 아이템으로 커스텀 뷰를 쓰신다면 리스트 뷰를 invalidate() 하셔야 될듯해요
뭘 답해야 할지 모를 질문.. 이네요?