2016-10-25 3 views
0

RecyclerView의 데이터를 스크롤하면 logtime.get(i).getTime()의 데이터가 변경되지 않더라도 TextView의 데이터가 변경됩니다. 동적으로 생성되는 textview 내부에 데이터를 배치 할 때만 변경됩니다.프로그래밍 방식으로 recyclerview onbind 뷰어 어댑터 내부에 텍스트 뷰 추가

public void onBindViewHolder(PunchCardViewHolder holder, int position) { 

    PunchCardReport punchCardReport = punchCardReports.get(position); 
    holder.sNumber.setText(punchCardReport.getmSNumber()); 
    holder.logDate.setText(punchCardReport.getmLogDate()); 
    StringTokenizer stringTokenizer = new StringTokenizer(punchCardReport.getmLogTime(), ","); 
    List<LogTime> logtime = punchCardReport.getmLogTimeList(); 
    for (int i = 0; i < logtime.size(); i++) { 
     Log.d(TAG, "onBindViewHolder: "+logtime.get(i).getTime()); 

    } 
    LinearLayout.LayoutParams dim = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
    for (int i = 0; i < logtime.size(); i++) { 

     TextView textView=new TextView(mContext); 
     textView.setLayoutParams(dim); 
     textView.setText(logtime.get(i).getTime());//the problem is here when we put data inside textview 
     holder.logTime.addView(textView); 
    } 

} 
    @Override 
    public int getItemCount() { 
     return punchCardReports.size(); 
    } 

답변

0

이 줄을 onbindViewHolder로 시작하십시오.

holder.setIsRecyclable (false);

또는 TextView를 XML 파일에 넣을 수 있습니다. Onbinder에서 동적 텍스트 뷰를 만들 필요가 없습니다.

+0

감사합니다 ...이 작동 ... –

+0

이 해결책은 메모리 문제를 일으킬 수 있습니다. 텍스트보기 및 다른보기를 위해 XML을 작성해야합니다. OnBindViewHolder() 안의 뷰 만들기는 권장하지 않습니다. 원한다면 데모 소스 코드를 제공합니다. –

2

디자인이 완전히 잘못되었습니다. onBindViewHolder()을 호출 할 때마다 TextView이 새로 생성됩니다. 즉, 스크롤으로 돌아 가면 TextView의 새 목록이 작성되므로 이제 마지막 세트에서 하나와 지금부터 두 세트가 있습니다 (Keep 스크롤하면 더 많은 추가 TextViews이 첨부됩니다).

새보기 만들기는 onCreateViewHolder()이어야합니다. 이 문제가 발생하는 이유는 RecyclerViewScrapped Views이므로 이전에 생성 된 View을 다시 사용하기 때문일 수 있습니다. 따라서 성능을 향상시킵니다 (새 메모리 할당이 필요하지 않기 때문에). 중첩 된 RecyclerView을 찾으려면 대신 수행하십시오.

+0

동의합니다. 메모리 누출 또는 기타 성능 문제가 발생할 수 있습니다. –

0

다음 코드를 onBindViewHolder에 추가 할 수 있습니다.

if(holder.logTime.getChildCount()>0){ 
    holder.logTime.removeAllViews(); 
} 

for (int i = 0; i < logtime.size(); i++) { 

    TextView textView=new TextView(mContext); 
    textView.setLayoutParams(dim); 
    textView.setText(logtime.get(i).getTime()); 
    //the problem is here when we put data inside textview 
    holder.logTime.addView(textView); 
} 
관련 문제