마스터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 구문을 지워버리니까 정상적으로 나오네요.. 자동으로 추가해주는 옵션 같은게 있는 건가...??

답변 달기

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