2013-04-05 2 views
2

내 Android 용 ListView를 사용자 정의하고 getView() 메소드에 문제가 있습니다. 여기 사용자 지정 listView가 무작위 순서로 적은 항목을 표시합니다.

public class BinderData extends BaseAdapter { 

    private LayoutInflater inflater; 
    private ArrayList targetList; 
    private ViewHolder holder; 
    private Activity nikola; 
    private Context context; 

    private static ArrayList genres = new ArrayList(); 

    public BinderData(Activity act, List<Genre> map) { 
     targetList = new ArrayList(); 
     for (int i = 0; i<map.size(); i++){ 
      Genre genre = map.get(i); 
      targetList.add(genre); 
      ArrayList<Artist> aList = genre.getArtists(); 
      for (int j = 0; j<aList.size(); j++){ 
       targetList.add(aList.get(j)); 
      } 
     } 
     this.nikola = act; 
     inflater = (LayoutInflater) act 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

그리고

내가 내 목록에 대한 레이아웃의 두 유형이 내의 getView() 메소드

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

     if (convertView == null){ 
      ViewableItem item = (ViewableItem)targetList.get(position); 
      if (item.isTypeOf().equalsIgnoreCase("genre")){ 
       vi = inflater.inflate(R.layout.category_row, null); 
       holder = new GenreViewHolder(); 
       ((GenreViewHolder)holder).textViewGenreTitle = (TextView)vi.findViewById(R.id.textViewCategoryTitle); 
       String s = ((Genre)item).getTitle(); 
       holder.setTitle(s); 
      }else{ 
       vi = inflater.inflate(R.layout.list_row, null); 
       holder = new ArtistViewHolder(); 
       ((ArtistViewHolder)holder).textViewArtistName = (TextView)vi.findViewById(R.id.textViewAuthorNameHome); 
       String s = ((Artist)item).getArtist(); 
       holder.setArtistName(s); 
      } 
      vi.setTag(holder); 
     }else{ 
      holder = (ViewHolder)vi.getTag(); 
     } 

     return vi; 
    } 

입니다. 하나는 카테고리 제목 용이고 다른 하나는 해당 카테고리 아래 항목 용입니다.

http://imgur.com/xbPfGTi는 - 여기에 내가 내 목록보기에 표시해야 할 데이터로 채워진 TARGETLIST을 한 사진

입니다. (생성자에서) 그리고 문제가 있습니다! 목록에있는 아티스트가 계속 반복되며 카테고리가 올바른 위치에 있지 않습니다.

아이디어가 있으십니까?

+0

정확한 문제는 무엇입니까? –

+0

그림에서 볼 수 있습니다 ... 단지 5 ~ 6 개의 화면이 팽창되어있는 것처럼 보입니다. 다른 아티스트 (60 명)가 전혀 표시되지 않습니다 ... 하지만 이걸 지우면 --- (convertView == null) --- 모든 것이 정상적으로 작동합니다. 메모리 누수가있어 잠시 후 앱이 멈추는 문제가 있습니다. –

+0

그리고 POP 카테고리를 두 배로해서는 안되는 또 하나의 문제가 있습니다. 그 행의 위치가 잘못되어 팝업 중 하나가 아닐 것이고, 뮤 또는 target list가 무 타겟이어야합니다. –

답변

2

convertView != null 일 때 데이터를 행에 바인딩하지 않기 때문에 문제가 발생하는 대신 재활용 된 동일한 convertView을 반환하므로 동일한 반복 데이터가 표시됩니다.

는이 같은 데이터 유형에 따라 모든 행에 대한 행의 View s의 데이터를 바인딩해야합니다

public View getView(int position, View convertView, ViewGroup parent) { 
    final View row; 
    boolean isGenreRow = getItemViewType(position) == GENRE_ROW; 

    // Inflate views if this is a new row 
    if (convertView == null) { 
     // Get the right type of view depending on the type of data 
     if (isGenreRow) { 
      row = inflater.inflate(R.layout.category_row, null); 
      holder = new GenreViewHolder(); 
      ((GenreViewHolder) holder).textViewGenreTitle = (TextView) row.findViewById(R.id.textViewCategoryTitle); 
     } 
     else { 
      row = inflater.inflate(R.layout.list_row, null); 
      holder = new ArtistViewHolder(); 
      ((ArtistViewHolder) holder).textViewArtistName = (TextView) row.findViewById(R.id.textViewAuthorNameHome); 
     } 
     row.setTag(holder); 
    } 
    // Otherwise, use the recycled row 
    else { 
     row = convertView; 
     holder = (ViewHolder) row.getTag(); 
    } 

    // Bind data to views, depending on data type 
    ViewableItem item = (ViewableItem) targetList.get(position); 
    if (isGenreRow) { 
     ((GenreViewHolder) holder).setTitle(((Genre) item).getTitle()); 
    } 
    else { 
     ((ArtistViewHolder) holder).setArtistName(((Artist) item).getArtist()); 
    } 

    return row; 
} 

당신은 또한 BaseAdapter가 있다는 것을 알리기 위해 몇 가지 다른 방법을 재정의해야합니다 둘 이상의 데이터 유형이 있으므로 행의 View을 재활용하는 방법을 알고 있습니다.

private static final int GENRE_ROW = 0; 
private static final int ARTIST_ROW = 1; 

@Override 
public int getItemViewType(int position) { 
    // Return the row type at the position 
    ViewableItem item = (ViewableItem) targetList.get(position); 
    return item.isTypeOf().equalsIgnoreCase("genre") ? GENRE_ROW : ARTIST_ROW; 
} 

@Override 
public int getViewTypeCount() { 
    // Return the number of row types there are 
    return 2; 
} 

실수로 실수하지 않았다면이 솔루션을 복사하여 붙여 넣을 수 있어야합니다.

+0

나는 당신을 사랑한다고 생각합니다 !!! :) <3 나는 이것을 두어 시간 동안 알아 냈다. 그리고 나는 네가 날을 지었다고 말할 필요가있다. 대단히 감사합니다! 모든 것이 완벽하게 작동합니다 ... 질문이 하나 더 있습니다 ... 내보기에 데이터를 바인딩하는 동일한 위치에서 onClickListeners를 정의 할 수 있습니까? –

+0

신난다, 나는 어떤 실수도하지 않았다 :). 네, 뷰에 데이터를 바인딩하는 영역에 클릭 리스너를 추가 할 수 있습니다 (이전에 해 보았습니다). –

+0

다시 한 번 감사드립니다 .... –

관련 문제