2014-05-11 2 views
2

나는 안드로이드 프로젝트에서 일하고있다. 내 활동 중 하나에는 내부 클래스 ChatHistoryAdapter가 있습니다. 활동이 시작되면 목록이 올바르게 표시되지만 스크롤 한 후 일부 항목이 복제됩니다. 솔루션을 검색했지만 거의 모든 솔루션은 setTag() 또는 Inflater에 대한 것이 었습니다.안드로이드리스트 스크롤에 반복되는 아이템보기

private void loadMessages() { 
    this.messages = new ArrayList<Message>(); 
    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      messages = dbMes.gettMessages(guest.getId()); // gettMessages is Synchronized 
      chatHistoryAdapter = new ChatHistoryAdapter(getLayoutInflater()); 
      listView.setAdapter(chatHistoryAdapter); 
     } 
    }; 
    Thread T = new Thread(r); 
    T.start(); 
} 

enter image description here

: 문제는 여기에 ... 여기

private class ChatHistoryAdapter extends BaseAdapter { 
    private LayoutInflater inflater; 

    public ChatHistoryAdapter(LayoutInflater inflater) { 
     this.inflater = inflater; 
    } 

    public void newOne() { 
     notifyDataSetChanged(); 

    } 

    @Override 
    public int getCount() { 
     return messages.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return messages.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int position, View myView, ViewGroup vg) { 
     MessageHolder messageHolder; 

     if (myView == null){ 
      myView = this.inflater.inflate(R.layout.chat_list_item, null, false); 
      messageHolder = new MessageHolder(); 
      messageHolder.hisTxt = (TextView)myView.findViewById(R.id.hisText); 
      messageHolder.myTxt = (TextView)myView.findViewById(R.id.myText); 
      myView.setTag(messageHolder); 
     } else { 
      messageHolder = (MessageHolder) myView.getTag(); 
     } 

     Message mes = messages.get(position); 

     if (mes.myMessage()){ 
       messageHolder.myTxt.setText(mes.toString()); 
     } else{ 
       messageHolder.hisTxt.setText(mes.toString()); 
     } 

     return myView; 
    } 

} 

private static class MessageHolder{ 
    TextView hisTxt; 
    TextView myTxt; 
} 

는 ArrayList를이 가득 부분 뭐죠 내 코드가 그들과 함께 괜찮다는 생각 .. 그래서 난 정말 이해 두지

+0

목록에 중복 된 항목이 포함되어 있습니까? 또는 그들을 만들려면 listview 무엇입니까? 목록의 요소를 확인하십시오. –

답변

9

ViewHolder 패턴을 사용 중이면 이전 값을 "정리"해야합니다.

이렇게하면됩니다.

if (mes.myMessage()){ 

     messageHolder.myTxt.setText(mes.toString()); 
     messageHolder.hisTxt.setText(""); 

} else { 

     messageHolder.myTxt.setText(""); 
     messageHolder.hisTxt.setText(mes.toString()); 
} 

희망이 있습니다.

+2

감사합니다. 몇 시간 동안 작업을 해봤지만이 모든 것을 시도했지만 .. + –

+0

도와 주셔서 감사합니다 :) 정답으로 표시해주세요. –