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

리스트뷰에 아이템이 중복 출력 됩니다.

0 추천
 
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mileage_menu);
handler = new Handler(); 
                  
                m_groups = new ArrayList<Mileagelist>();
                m_adapter = new MileageAdapter(MileageMenu.this,R.layout.mileage_list_detail, m_groups);
                total_list.setAdapter(m_adapter);
                  
                 
                viewGroups = new Runnable(){
                       @Override
                       public void run() {
                            getMailagelist();
                       }
                    };
                 
                 
                Thread thread =  new Thread(null, viewGroups, "MagentoBackground");
                thread.start();
 
}
 
public class MileageAdapter  extends ArrayAdapter<Mileagelist> {
 
          private ArrayList<Mileagelist> items;
           
          public MileageAdapter(Context context, int textViewResourceId, ArrayList<Mileagelist> items) {
            super(context, textViewResourceId, items);
            this.items = items;
            
          }
           
          public View getView(final int position, View convertView, ViewGroup parent) {
            DevLog.i("MileageAdapter.getView", "position:"+position); 
            View v = convertView;
            final Mileagelist m = items.get(position);
            final ViewHolder holder;
             
         
                  if (v == null) {
                       LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                       v = vi.inflate(R.layout.mileage_list_detail, null);
                       holder = new ViewHolder();
                       holder.t_date = (TextView) v.findViewById(R.id.t_mileage_date);
                       holder.t_dep = (TextView) v.findViewById(R.id.t_mileage_dep);
                       holder.t_msg = (TextView) v.findViewById(R.id.t_mileage_msg);
                       holder.t_total = (TextView) v.findViewById(R.id.t_mileage_total);
                         
                       v.setTag(holder);
                   }else{
                       holder = (ViewHolder)v.getTag();
                   
                   
                   if (m != null) {
                        
                       String date = m.getDate().substring(2, m.getDate().length()-3);
                       holder.t_date.setText(date);
                        
                       if(!m.getDep().equals("")){
                           holder.t_dep.setText(m.getDep()+"원");
                       }else{
                           holder.t_dep.setText(m.getExp()+"원");
                       }
                        
                       holder.t_msg.setText(m.getMsg());
                       holder.t_total.setText(m.getTotal()+"원");
                   }
                   
                  return v;
          }
         
    }
 
private void getMailagelist(){
        PhoneNumberMgr pMgr = new PhoneNumberMgr(MileageMenu.this);
        String cur_phone = pMgr.phone_1+"-"+pMgr.phone_2+"-"+pMgr.phone_3;
        r_groups = new ArrayList<Reclist>();
         
        String[] key_names = new String[6];
        key_names[0] = "dep";
        key_names[1] = "exp";
        key_names[2] = "type";
        key_names[3] = "msg";
        key_names[4] = "date";
        key_names[5] = "total";
   
        HashMap<String,ArrayList<String>> map = XmlParsingX.xmlParsingX(getResources().getString(R.string.custom_web_svr)
                + "select_mailage.php?phone="+cur_phone,key_names);
         
        ArrayList<String> deps = (ArrayList<String>)map.get(key_names[0]);
        ArrayList<String> exps = (ArrayList<String>)map.get(key_names[1]);
        ArrayList<String> types = (ArrayList<String>)map.get(key_names[2]);
        ArrayList<String> msgs = (ArrayList<String>)map.get(key_names[3]);
        ArrayList<String> dates = (ArrayList<String>)map.get(key_names[4]);
        ArrayList<String> totals = (ArrayList<String>)map.get(key_names[5]);
         
        for(int i=0;i<dates.size();i++){
            Mileagelist ml = new Mileagelist();
             
            if(deps.size() >= 1 && deps.get(i)!=null){
                ml.setDep(deps.get(i));
            }else{
                ml.setDep("");
            }
             
            if(exps.size() >= 1 && exps.get(i) != null){
                ml.setExp(exps.get(i));
            }else{
                ml.setExp("");
            }
             
            ml.setType(types.get(i));
            ml.setMsg(msgs.get(i));
            ml.setDate(dates.get(i));
            ml.setTotal(totals.get(i));
            m_groups.add(ml);
             
             
        }
          
        runOnUiThread(returnRes3);
    }
 
private Runnable returnRes3 = new Runnable() {
 
        @Override
        public void run() {
            int leng = m_groups.size();
             
            DevLog.i("Runnable", "mileage size : " + leng);
   
            if(m_groups != null && leng > 0){
                m_adapter.notifyDataSetChanged();
  
                for(int i=0;i<leng;i++){
                    progressVal++;
                    m_adapter.add(m_groups.get(i));
                    m_ProgressDialog.setProgress(progressVal);
                }
            }
              
            m_ProgressDialog.dismiss(); 
            m_adapter.notifyDataSetChanged();
                 
         }
    };
위처럼 만든어댑터를 리스트뷰에 적용하니
 
리스트아이템이 중복해서 출력됩니다.
 
m_groups 사이즈가 2인데
 
출력은 4개가 되는 것이죠...
 
그리고 getView호출은 찍어보니 3번 반복해서 출력되네요. 근데 이거랑은 상관없을 것 같아요.
 
부모가 wrap_content로 잡혀있으면 여러번 호출하니까요.
 
일월 (510 포인트) 님이 2014년 7월 11일 질문
일월님이 2014년 7월 11일 수정
m_adapter에 중복으로 들어갔는지는 확인해보셨나요?
getCount()로 체크해보니 2가 아니라 4가 나오네요...
m_adapter.add(m_groups.get(i)); 작업이 잘못된 것 같은데
로그로 찍어보니 2회만 찍힙니다..
왜 그런지 모르겠지만 add 구문을 지워버리니까 정상적으로 나오네요.. 자동으로 추가해주는 옵션 같은게 있는 건가...??

답변 달기

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