为什么Listview显示自定义适配器android的重复条目?

时间:2016-02-01 05:43:32

标签: android listview

我创建了自定义适配器以与listview绑定,但它在listview中显示重复的歌曲。请查看代码并告知我是否有任何错误

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;

}
}

4 个答案:

答案 0 :(得分: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);

尝试这个并告诉我它是否有效?

答案 1 :(得分:0)

在里面添加vi.setTag(p):

get_ets_keys_lazy(table_name) 
    |> Stream.map(lambda1) 
    |> Stream.each(lambda2)
    |> Stream.run

答案 2 :(得分: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);**

答案 3 :(得分: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方法并检查一次数据,因为您的适配器代码看起来很完美。

相关问题