2014-10-16 3 views
1

내 어플리케이션에 listview가 있고 listview의 행이 imageView와 Textview로 구성되어 있습니다. 응용 프로그램은 웹에서 이미지를 다운로드하여 행 레이아웃의 이미지 뷰를 설정합니다. 나는 목록보기를 위아래로 스크롤 할 때 이미지 재 다운로드에 관한 문제가있었습니다. 이런 이유로 나는 목록 항목을 저장하기 위해 ViewHolder 패턴을 사용했다. 문제는 해결되었지만 이번에는 새로운 문제가 있습니다.리스트 뷰를 스크롤하면리스트 뷰의 아이템 위치가 변경됩니다.

Listview에는 15 개의 행이 있습니다. 따라서 목록 하단의 항목은 표시되지 않습니다. 항목을보기 위해 목록을 스크롤하면 목록 상단의 항목이 lisview로 끝납니다. 또한 목록을 스크롤하면 목록 끝에있는 항목이 목록의 맨 위에 표시됩니다.

그래서 표시해야하는 값이나 행이 표시되지 않습니다.

내의 getView() 메소드의 마지막 상태는

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


     ViewHolder viewHolder; 

      if (convertView == null) { 

       convertView = mInflater.inflate(R.layout.row_layout, null); 

       TextView programName = (TextView)convertView.findViewById(R.id.programName); 
       TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
       TextView programState = (TextView)convertView.findViewById(R.id.programState); 
       ImageView programImage = (ImageView)convertView.findViewById(R.id.programImage); 


       programName.setText(values.programNames.get(position)); 
       programTime.setText(values.programTimes.get(position)); 
       new imageDownload(programImage).execute(values.programImageUrls.get(position)); 

       viewHolder = new ViewHolder(); 
       viewHolder.p_Name = programName; 
       viewHolder.p_Time = programTime; 
       viewHolder.p_State = programState; 
       viewHolder.p_Image = programImage; 

       convertView.setTag(viewHolder); 

      }else{ 

       viewHolder = (ViewHolder) convertView.getTag(); 
      } 

      return convertView; 
     } 

내보기 홀더 ...

public static class ViewHolder { 
    TextView p_Name; 
    TextView p_Time; 
    TextView p_State; 
    ImageView p_Image; 
} 

이 많은 당신에게

답변

2

이동 사용자가 설정 곳의 외부 감사 ..입니다 내 전환 보고서

programName.setText(values.programNames.get(position)); 
programTime.setText(values.programTimes.get(position)); 
new imageDownload(programImage).execute(values.programImageUrls.get(position)); 

는 그래서 내가보기 엔 당신을 위해 자동으로 캐싱 등을 처리하기 때문에 이미지 다운로드 피카소를 사용하는 것이 좋습니다 것입니다, 또한이

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


    ViewHolder viewHolder; 

     if (convertView == null) { 

      convertView = mInflater.inflate(R.layout.row_layout, null); 

      TextView programName = (TextView)convertView.findViewById(R.id.programName); 
      TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
      TextView programState = (TextView)convertView.findViewById(R.id.programState); 
      ImageView programImage =(ImageView)convertView.findViewById(R.id.programImage); 



      viewHolder = new ViewHolder(); 
      viewHolder.p_Name = programName; 
      viewHolder.p_Time = programTime; 
      viewHolder.p_State = programState; 
      viewHolder.p_Image = programImage; 

      convertView.setTag(viewHolder); 

     }else{ 

      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.p_Name.setText(values.programNames.get(position)); 
     viewHolder.p_Time.setText(values.programTimes.get(position)); 
     new imageDownload(programImage).execute(values.programImageUrls.get(position)); 


     return convertView; 
    } 

같다고. 또한 ViewHolder에 Butterknife를 주입하는 방법을 살펴 보겠습니다.

+1

programholder textview가 if/else 문의 범위를 벗어나면 viewholder.p_name.setText()에 연결하는 것이 좋습니다. – MrPancake

+0

특정 (고정) –

-1

검색된 ViewHolder의 위치를 ​​convertView.getTag()에서 비교할 수 있도록 ViewHolder 클래스의 위치 값이 있어야합니다. . convertView가 null이 아닌 경우, 뷰에 올바른 정보가 있는지 확인하려고합니다.

if (viewHolder.position != position) { 
    //retrieves the correct position of the information 
    viewHolder.p_Name.setText(values.programNames.get(position)); 

    //etc 
    viewHolder.position = position; 
} 
0

답장을 보내 주셔서 감사합니다. 나는 이미지를 위해 피카소를 사용하기로 결정했다. 아래 코드를 변경했습니다.

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

ViewHolder viewHolder; 

    if (convertView == null) { 

     convertView = mInflater.inflate(R.layout.row_layout, null); 

     TextView programName = (TextView)convertView.findViewById(R.id.programName); 
     TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
     TextView programState = (TextView)convertView.findViewById(R.id.programState); 
     ImageView programImage =(ImageView)convertView.findViewById(R.id.programImage); 

     viewHolder = new ViewHolder(); 
     viewHolder.p_Name = programName; 
     viewHolder.p_Time = programTime; 
     viewHolder.p_State = programState; 
     viewHolder.p_Image = programImage; 

     convertView.setTag(viewHolder); 

    }else{ 

     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
      viewHolder.p_Ad.setText(values.programIsimleri.get(position)); 
      viewHolder.p_Saat.setText(values.programSaatleri.get(position)); 
    Picasso.with(getApplicationContext()).load(values.programImageUrls.get(position)).into(viewHolder.p_Image); 


    return convertView; 
} 

코드가 올바르게 작동합니다.