2016-02-01 40 views
0

我創建了自定義適配器與listview綁定,但它在listview中顯示重複的歌曲。請查看代碼,並讓我知道什麼是錯的爲什麼Listview使用自定義適配器android顯示重複條目?

public class UnfavoriteSongAdapter extends BaseAdapter 

{ 

private Activity activity; 
private ArrayList<Media> data; 
private static LayoutInflater inflater = null; 

private Context context; 

public UnfavoriteSongAdapter(Context context, Activity a, ArrayList<Media> d) { 
    activity = a; 
    this.context = context; 
    data = d; 
    inflater = (LayoutInflater) activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

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

@Override 
public Object getItem(int position) { 
    return position; 
} 

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


GenreFavoriteClickListner genreFavoriteClickListner; 

public interface GenreFavoriteClickListner { 
    public void onFavoriteClickListner(int position,Media media); 
} 

public void setGenreFavoriteClickListner(GenreFavoriteClickListner genreFavoriteClickListner) { 
    this.genreFavoriteClickListner = genreFavoriteClickListner; 
} 


public static class ViewHolder { 
    public TextView textView_title, textView_artist, textView_time; 
    public CircleImageView circleImageView_albumphoto, circleImageView_favorite; 
    public ImageView imageView_play; 

} 

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

    View vi = convertView; 
    final ViewHolder viewHolder; 
    try { 
     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      vi = inflater1.inflate(R.layout.song_listitem_layout, null); 
      viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname); 
      viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname); 
      viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time); 
      viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing); 
      viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite); 
      viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause); 

     } else { 
      viewHolder = (ViewHolder) vi.getTag(); 
     } 
     if (data.size() <= 0) { 
      //viewHolder.textview_albumtitle.setText("No Appointment"); 
     } else { 

      final Media p = data.get(position); 
      viewHolder.textView_title.setText(p.getSongName()); 
      viewHolder.textView_artist.setText(p.getArtistName()); 
      long millis = Long.parseLong(p.getDuration()); 
      String hms = ReusableModules.getCalculatedTime(millis); 
      viewHolder.textView_time.setText(hms); 
      String isplaying = p.getIsPlaying(); 
      int playingid = R.mipmap.play; 
      if (isplaying != null) { 
       if(isplaying.contentEquals(Constants.ONE)){ 
        playingid = R.mipmap.runing_music_play; 
       } 
      } 
      viewHolder.imageView_play.setImageResource(playingid); 


      ReusableModules.setFavoriteToggleButton(p.getIsFavorite(), viewHolder.circleImageView_favorite); 

      viewHolder.circleImageView_favorite.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if (genreFavoriteClickListner != null) { 
         genreFavoriteClickListner.onFavoriteClickListner(position,p); 
        } 
       } 
      }); 

      final String finalUrl = p.getAlbumUrl(); 
      viewHolder.circleImageView_albumphoto.post(new Runnable() { 
       @Override 
       public void run() { 
        BaseActivity.imageLoader.displayImage(finalUrl, 
          viewHolder.circleImageView_albumphoto, SplashScreenActivity.displayImageOptions, new SimpleImageLoadingListener() { 
           @Override 
           public void onLoadingComplete(Bitmap loadedImage) { 

           } 
          }); 
       } 
      }); 
      vi.setTag(p); 
     } 

    } catch (Exception e) { 

    } 
    return vi; 

} 
} 

回答

0

移動

vi.setTag(viewholder); 

if(convert==null){ 
      viewHolder = new ViewHolder(); 
      final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      vi = inflater1.inflate(R.layout.song_listitem_layout, null); 
      viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname); 
      viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname); 
      viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time); 
      viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing); 
      viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite); 
      viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause); 

      // here 
      vi.setTag(viewholder); 
} 

並刪除它:

 final String finalUrl = p.getAlbumUrl(); 
     viewHolder.circleImageView_albumphoto.post(new Runnable() { 
      @Override 
      public void run() { 
       BaseActivity.imageLoader.displayImage(finalUrl, 
         viewHolder.circleImageView_albumphoto, SplashScreenActivity.displayImageOptions, new SimpleImageLoadingListener() { 
          @Override 
          public void onLoadingComplete(Bitmap loadedImage) { 

          } 
         }); 
      } 
     }); 
    remove this **vi.setTag(p);** 
+0

我知道他是設置標記之後,如果塊如此他將如何獲得標記,並請檢查代碼OP已給出 –

+0

其中是v1.setTag(p)如果塊的convertView –

+0

我設置媒體對象作爲標記,因爲當我點擊物品時,我想要這個物品。 –

0

添加vi.setTag(P)內:

if(convertView == null){ 
vi.setTag(p); 
} 
+0

謝謝@nikk。但是,它不工作。 –

2

像這樣改變getView()方法。

viewHolder = new ViewHolder(); 
    if (convertView == null) { 
     final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 
     vi = inflater1.inflate(R.layout.song_listitem_layout, null); 
     viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname); 
     viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname); 
     viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time); 
     viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing); 
     viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite); 
     viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause); 

,並刪除該

else { 
     viewHolder = (ViewHolder) vi.getTag(); 
    } 

去年getView()方法

convertView.setTag(holder); 

的試試這個,告訴我它的工作原理或不?

+0

它不工作。當我使用自定義適配器與listview綁定時,它會在每第7個位置後襬動重複的項目。這可以幫助您更多地瞭解問題 –

+0

好的,讓我檢查一下。 –

+0

試試這個@DharmeshDhameliya –

0

如果視圖持有者爲null,則爲視圖持有者設置標籤。添加最後一行代碼

if (convertView == null) { 
       viewHolder = new ViewHolder(); 
       final LayoutInflater inflater1 = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       vi = inflater1.inflate(R.layout.song_listitem_layout, null); 
       viewHolder.textView_title = (TextView) vi.findViewById(R.id.textView_song_songname); 
       viewHolder.textView_artist = (TextView) vi.findViewById(R.id.textView_song_artistname); 
       viewHolder.textView_time = (TextView) vi.findViewById(R.id.textView_song_time); 
       viewHolder.circleImageView_albumphoto = (CircleImageView) vi.findViewById(R.id.circleImageView_nowplaying_playing); 
       viewHolder.circleImageView_favorite = (CircleImageView) vi.findViewById(R.id.circleImageView_song_favorite); 
       viewHolder.imageView_play = (ImageView) vi.findViewById(R.id.imageView_song_playpause); 


       /************ Set holder with LayoutInflater ************/ 
       vi.setTag(viewHolder); 

      } 

//檢查您的數據大小getCount,這是一個很好的做法。不在getview方法中。

@Override 
public int getCount() { 
    if(data!=null && data.size()> 0) 
    return data.size(); 
    else 
    return 0; 
} 

我建議你更換getview方法,並檢查你的數據一度因爲你的適配器代碼似乎完美。

+0

它仍然顯示重複的項目。 –

+0

檢查我更新的答案。 – Nil

+0

我應用了你的代碼。但它不起作用。 –

相關問題