View Pager를 구현하면서 이벤트 발생시 (버튼 클릭) 현재 CurrentItem을 삭제하려고 하는대 해당 객체를 담아둔 ArrayList에서는 재대로
CurrentItem 을 삭제하나 RemoveView는 가장 마지막 View를 삭제하네요
디버깅 결과
public void removeItem(int position){
mItems.remove(position);
notifyDataSetChanged();
}
메소드를 실행하여 해당 View를 삭제하고자 하는대 해당 메소드에서는 mItems의 삭제하고자 하는 부분을 재대로 삭제하나
notifyDataSetChanged();를 통해 갱신 시
@Override
public void destroyItem(View pager, int position, Object view) {
((ViewPager)pager).removeView((View)view);
}
메소드에서 해당 뷰를 삭제하는대 인자값이 제가 준 Position 과 View 값이 아닙니다.
destroyItem 의 인자값을 변경하여 제가 원하고자 하는 값을 주거나 다른 메소드 또는 방법으로 원하는 Voew를 삭제하는 방법이 있을까요
구글링 해도 이정보에 대한 건은 못찾겠네요 ㅠㅠ 부탁드립니다.
getChildCount와 position 계산을 잘못했다는 말씀이 어떤건지 정확히 잘 모르겠습니다. 디버깅을 통해 MChildren 의 값을 확인한 결과 제가 원하는 순서대로 들어가 있습니다. 제 문제는 destroyItem 메소드 실행시 들어오는 값을 제가 임의로 지정해 주어야 하는건지 아니면 자동으로 제가 삭제한 View를 찾아가는지 궁금합니다 ㅠㅠ 현재 제가 지정을 해주지 않고 mItems.remove(position); 실행 후 notifyDataSetChanged(); 메소드 실행을 통해 destroyItem메소드 가 실행이 되니 Position 과 View의 값이 항상 맨 마지막의 값이 들어가지네요 ㅠ
일단 ViewPager 사용하시는거 맞죠??
맞다면 어댑터는 PagerAdapter 클래스를 상속받으셨을테구요..
암튼 거기서 destroyItem은 해당 view를 콜백으로 자동 삭제해줍니다.
(제 기억상 아마.. 두단계 이전의 view일꺼에요.. 예를 들어 페이지 이동 후 현재 position이 3이면 1번째 뷰를 삭제해줍니다..)
글고 혹시.. getCount 메소드는 오버라이딩해서 재정의하셨죠??
참고로 위에서 제가 얘기했던 내용은 아래 빨간 글씨 부분입니다..
public Object instantiateItem(View collection, int position) {
어쩌고저쩌고...
((ViewPager) collection).addView(view, position); <-- 혹시 이런 방식으로 view를 추가하셨다면.. 아래처럼 바꿔서해보라는 얘기였어요~
((ViewPager)collection).addView(view, ((ViewPager)collection).getChildCount() > position ? position : ((ViewPager)collection).getChildCount());
}
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
제가 한 가지 궁금한 점은요..
버튼 클릭시에 destroyItem 메소드 실행을 위해서,, notifyDataSetChanged()를 왜 호출하시는거죠??
일반적으로..
getCount 에서 해당 페이지 갯수 세팅하시구요..
(1) 어떤 액션이 발생하는 경우(버튼 클릭, 페이지 넘김 등등) instantiateItem 메소드 내부에서 뷰 추가
즉,, 예를 들어 instantiateItem 내부에서..
if(position == 0){
버튼 setOnClickListener 처리
}
else if(position == 1){
버튼 setOnClickListener 처리
}
...
해당 뷰 addView 처리
(2) destroyItem은 자동으로 호출되어.. 해당되는 뷰를 찾아 삭제시킴
이런 형태로 구성되어야 할 것 같은데요...
정확한건 소스를 봐야 알 수 있을 것 같습니다..
일단 destroyItem 의 position 에 대해서 간략하게 설명해드릴께요..
예를 들어.. 총 5개의 페이지뷰가 있다고 가정하구요..
만약 현재 2페이지에서 3페이지로 넘긴 직후라면,, destroyItem은 자동으로 호출되어 두단계 이전, 즉 1번째 뷰를 삭제합니다.
그리고 instantiateItem 도 자동 호출되어 4번째 뷰를 미리 추가해주게됩니다.
여기서 메모리에 실제 존재하는 뷰는 2,3,4번이 되겠지요..
꼬기님께서 현재 위치에 대한 뷰를 삭제하고 싶으신건지.. 아님 어떤 위치의 뷰를 삭제하고 싶으신건지 정확히 이해가 안갑니다만..
암튼 특정 포지션의 뷰를 삭제하고픈 경우에는 destroyItem 과 notifyDataSetChanged 메소드를 오버라이딩 하셔야될꺼에요..
참고로 예전에 찾아봤던 비슷한 내용인데.. 아래 링크 함 참고해보세요~ 혹시 도움이 되실런지..
http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view
흠 제가 글제주가 없어 질문을 계속 혼란스럽게 드렸네요 ㅠㅠ
지금 가장 큰 문제는 현재 removeItem을 통해 삭제한 내용이 적용이 안된다고 해야할까요..
remove아이템을 통해 mItems 의 내용을 변경하였는대 View에서 지워지는 내용은 mItems에서 삭제된 내용이 아니고
가장 마지막 View가 지워지고 있습니다. ㅠㅠ
삭제후에 pager에 아답터를 새로 설정해주면 갱신이 되기는 하나 그거는 왠지 가라인것 같고 정석인 방법이 있을거 같은대
api나 구글링을 봐도 잘 모르겠네요 ㅠㅠ
세바스챤님께 도움을 받으면서 제가 잘못알고 있던 부분도 많아서 다시 차근차근 훑어보려 하고 있습니다
세바스찬님 지속적으로 관심가지고 도움주셔서 감사합니다 ^^




첨에 instantiateItem에서 addView할때 view의 getChildCount와 position 계산을 잘못한건 아니신지요..??