2012-12-21 2 views
0

목록보기 항목에 동적 textview를 추가하려고합니다. 데이터에 따라 1-2 개 또는 그 이상이 될 수 있습니다. 텍스트 뷰 추가에 성공했지만 문제는 스크롤에 대해 반복됩니다.사용자 지정 목록보기 반복되는 항목

루프에서 매번 textview의 새로운 객체를 생성합니다. 기존의 뷰를 재사용하려고 시도하지만 매번 새로운 뷰를 추가해야한다는 문제를 알고 있습니다. 여기

사용자 정의 어댑터 내 코드입니다 :

public class ViewHolder { 
    TextView text1; 
    LinearLayout linearLayout; 
    TextView t; 
    TextView t1; 
} 

의 getView 방법

public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.two_item_icon_text, null); 
     holder = new ViewHolder(); 
     holder.text1 = (TextView) convertView.findViewById(R.id.text1); 

     convertView.setTag(holder); 
    } else { 

     holder = (ViewHolder) convertView.getTag(); 

    } 

    holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.lin_lay_dynamic); 
    holder.text1.setText("" + DATA1[position]); 
    String tmp, dateparsed; 
    dateparsed = DATA1[position].substring(0, DATA1[position].indexOf(":")); 
    for (int x = 0; x < calendareventholder1.size(); x++) { 

     objHolder = (CalendarEventHolder) calendareventholder1.get(x); 

     if (objHolder.opendate.equals(displaydate[current])) { 

      tmp = objHolder.dtstarttime.toString().substring(0, objHolder.dtstarttime.toString().indexOf(":")); 

      if (Integer.parseInt(tmp) >= Integer.parseInt(dateparsed) && Integer.parseInt(tmp) < Integer.parseInt(dateparsed) + 1) { 
       holder.t = new TextView(convertView.getContext()); 
       holder.t.setText(":-d "); 
       holder.t.setOnClickListener(this); 

       if (Common.isChildSessionAlerted(String.valueOf(objHolder.id), getApplicationContext(), object1)) { 

        holder.t.setText(holder.t.getText() + objHolder.dtstarttime + " " + objHolder.dtendtime + " :-a"); 
       } else { 
        holder.t.setText(holder.t.getText() + objHolder.dtstarttime + " " + objHolder.dtendtime); 
       } 
       holder.t.setTag(objHolder.id); 
       holder.t.setTextSize(Common.getPreferenceInt(getApplicationContext(), Common.PREF_FONT_SIZE, 10)); 
       holder.t.setTextColor(Color.BLACK); 
       holder.t.setText(getSmiledText(ScheduleActivity.this, 
       holder.t.getText().toString())); 
       holder.linearLayout.addView(holder.t); 
       holder.t1 = new TextView(convertView.getContext()); 
       holder.t1.setOnClickListener(this); 
       holder.t1.setText(objHolder.title); 
       holder.t1.setTag(objHolder.id); 

       holder.t1.setTextSize(Common.getPreferenceInt(getApplicationContext(), Common.PREF_FONT_SIZE, 10)); 
       holder.t1.setTextColor(Color.BLACK); 
       holder.linearLayout.addView(holder.t1); 
      } 
     } 
    } 
    return convertView; 
} 

답변

1

그것은 슈퍼 설명하지 않기 때문에 정말 홀더에 이해하기 어려운 작은하지만, 만약 내가 귀하의 질문을 바로 읽고, 이유는 당신이 반복되는 항목을 받고있는 이유는 당신이 단지 Views을 추가하고 있기 때문에 결코 전에 거기에 삭제됩니다. ListView은 뷰를 재활용합니다. 즉 이전에 있었던 뷰를 그대로 유지합니다. 스크롤 할 때 실제로 새로운보기를 만드는 대신보기를 재사용합니다. 나는 비슷한 문제로 여기에 질문의 무리가 있기 때문에 자세히 설명하지 않을 것이다. 하지만해야 할 상단에

getView() { 
    /*previous stuff, and holder.linearLayout must have been set!*/ 
    if(holder.linearLayout.getChildCount() > 0) 
     holder.linearLayout.removeAllViews(); 

이렇게하면 이미보기가 제거됩니다. 마지막으로, this도 확인해야합니다. 왜 내가 게시 한 것을해야 하는지를 이해하는데 큰 도움이됩니다.

+0

그 덕분에 감사합니다. –

+0

문제 없습니다. 한 가지 빨리, 당신은 아마'removeAllViews' 호출 여부를 알기위한 점검을해야합니다. 'LinearLayout'에 자식이 없을 때 호출 할 필요가 없습니다. 나는 그것을 새롭게 할 것이다. – Andy

+0

수백만의 감사와 andy, 당신은 나의 날을 구했다. –

관련 문제