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

ListView에서 삭제가 엉터리로 됩니다.

0 추천

ListView에서 무조건 맨아래행만 삭제가 됩니다

도대체 왜 그럴까요?

 

public class ListItem {
 public String name = "";
 public ListItem(String _name){
  this.groupA = _groupA;
 }
 public String getName() {
  return name;
 }
 public void setName(String Name) {
  this.Name = Name;
 }
}

public class myPagerAdapter extends PagerAdapter{

 private LayoutInflater mInflater;
 String[] wordTitle ={"영어", "한자", "일본어", "오답노트", "내단어장"};
 String[] wordTitle2 ={"영어2", "한자2", "일본어2", "오답노트2", "내단어장2"};
 String[] wordTitle3 ={"영어3", "한자3", "일본어3", "오답노트3", "내단어장3"};
 String[] wordTitle4 ={"영어4", "한자4", "일본어4", "오답노트4", "내단어장4"};
 ListView wordList;
 private final Handler handler = new Handler(); 
 ArrayList<ListItem> list = null;
 WordListItemAdapter adapter = null; 
 Context mContext;
 View convertView;
 ListItem  Item;
 public myPagerAdapter(Context context, int cnt) {
  super();
  mInflater = LayoutInflater.from(context);
     mContext = context;
  mHelper = new WordDBHelper(context);
        this.list = new ArrayList<ListItem>();

 adapter = new WordListItemAdapter(mContext, list, R.layout.Title_list_item);
  
 }
 
 // PagerAdapter에서 관리할 View 개수를 반환합니다.
 public int getCount() {
  return 3;
 }
 
 @Override
 public int getItemPosition(Object object) {
  // TODO Auto-generated method stub
  return POSITION_NONE;
 }

 @Override

 
 // ViewPager에서 사용할 View를 생성하고 등록해줍니다.
 public Object instantiateItem(View pager, int position){
  convertView = mInflater.inflate(R.layout.title_list, null);
  wordList    = (ListView)convertView.findViewById(R.id.wordList);
                //원본은 position 마다 틀리게 저장함
  for(int i=0 ; i<wordTitle.size(); i++)
  {
   list(new ListItem(wordTitle[i]);
  }
                adapter.setAdapter(adapter);
  
  
  wordList.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
     long arg3) {
    // TODO Auto-generated method stub
    //무조건 맨아래행만삭제됨
    list.remove(arg2);
    adapter.notifyDataSetChanged();
  });
  
  ((ViewPager)pager).addView(convertView, null);
  //((ViewPager)pager).getAdapter().notifyDataSetChanged();
  return convertView;
 }
}

헨씀히포 (3,660 포인트) 님이 2014년 4월 15일 질문
Adapter에서 getItem()을 오버라이드해서 알맞게 작성하면 해결되지 않을까요?
오버라이드해서가 어떻게 하시라는 건지 모르겠습니다
어떻게 해야되는지요?
죄송합니다 페이저인지 못봤네요.
흠.. 페이저는.. 잘 모르겠네요 ㅠ
보니까 페이저 안에 리스트가 있는 것 같아서 그냥 간단하게
테스트코드를 만들어서 한번 돌려봤습니다.
복잡하게는 짜보지 못하였고
Activity에 리스트만 하나 올리고
BaseAdapter를 상속받은 Adapter를 만들어서
아이템 6개를 넣고 해봤는데요.
누르는 아이템이 지워지고 있네요.

onItemClick에서 arg2가 정상적으로 넘어오는지 확인해보시고
list.remove()를 하실 때 리턴되어 넘어오는 값을 받아서
제대로 된 값이 삭제되었는지 확인해보시는 것도 좋을 것 같습니다.
정말 고맙습니다,
원인은 알았습니다
PagerAdapter 안에 아래와 같은함수가 있는데요
@Override
public int getItemPosition(Object object) {
      return POSITION_NONE;//super.getItemPosition(object);
}
super.getItemPosition(object) 할때는 좌우로 스클롤시에 리스트뷰에 화면상으로 리프레쉬가 안되고 이전 화면이 보여서 POSITION_NONE 라고 했더니 리프레쉬가 잘 되더라구요
그런데 위의 문제가 발생합니다 맨마지막행만 삭제가 되고 수정도 안됩니다 super.getItemPosition(object)이걸로 하면 원하는 행이 삭제가 되고 수정도 됩니다
어떻게 하면 두개가 다 만족되게 할수 잇을까요?
저도 한번 해보았습니다.
일단 액티비티에 뷰페이저를 올렸고요
PagerAdapter를 상속받아서 새로운 어댑터를 만들었습니다.
어댑터에서 오버라이드한 메서드는 다음과 같습니다.
getCount()
isViewFromObject()
instantiateItem()
destroyItem()

getCount()에서는 액티비티에서 어댑터를 만들 때 넘겨받은 리스트의 사이즈를 반환하게 했습니다.
isViewFromObject()에서는 넘어온 두 인자가 같은지를 비교하여 반환하였습니다.
instantiateItem()에서는 제가 만든 RelativeLayout을 생성하여 넘어온 container에 넣었습니다.
(RelativeLayout은 ListView를 갖고 있습니다.)
destroyItem()에서는 넘어온 object를 View로 강제형변환하여 넘어온 container에서 지웠습니다.

제가 만든 RelativeLayout에는 BaseAdapter를 상속받은 어댑터를 넣어준 리스트뷰가 있습니다.
이 리스트뷰에 OnItemClick을 넣었고요 리스트의 한 행을 선택하면 선택한 행을 배열(ArrayList)에서 지운 뒤에 어댑터에 notifyDataSetChanged()로 알렸습니다.

질문에서는 맨 아래행이 삭제된다고 하셨는데, getItemPosition() 이 메서드는 리스트의 어댑터 메서드가 아니라 페이저의 어댑터 메서드입니다. 리스트의 마지막행이 자꾸 삭제된다면 리스트의 어댑터를 살펴보셔야 할 것 같습니다.
어렵네요 빠쁘실텐데 고맙습니다

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...