Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Listview使用自定义适配器android显示重复条目?_Android_Listview - Fatal编程技术网

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

为什么Listview使用自定义适配器android显示重复条目?,android,listview,Android,Listview,我创建了与listview绑定的自定义适配器,但它在listview中显示重复的歌曲。请检查代码,如果有什么问题请告诉我 public class UnfavoriteSongAdapter extends BaseAdapter { private Activity activity; private ArrayList<Media> data; private static LayoutInflater inflater = null; private Context co

我创建了与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;

}
}
公共类不受欢迎SongAdapter扩展BaseAdapter
{
私人活动;
私有数组列表数据;
专用静态充气机=空;
私人语境;
公共不受欢迎的SongAdapter(上下文、活动a、ArrayList d){
活动=a;
this.context=上下文;
数据=d;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
GenreFavoriteClickListner GenreFavoriteClickListner;
公共接口GenreFavoriteClickListner{
FavoriteClicklistner上的公共无效(int位置,媒体);
}
public void setGenreFavoriteClickListner(GenreFavoriteClickListner GenreFavoriteClickListner){
this.genreFavoriteClickListner=genreFavoriteClickListner;
}
公共静态类视图持有者{
公共文本视图文本视图标题、文本视图艺术家、文本视图时间;
公共CircleImageView CircleImageView_相册照片,CircleImageView_收藏夹;
公共图像查看图像查看播放;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图vi=转换视图;
最终持票人;
试一试{
if(convertView==null){
viewHolder=新的viewHolder();
最终LayoutFlater充气器1=(LayoutFlater)activity.getSystemService(Context.LAYOUT\u充气器\u服务);
vi=充气机1.充气(R.layout.song\u listitem\u layout,null);
viewHolder.textView\u title=(textView)vi.findViewById(R.id.textView\u song\u songname);
viewHolder.textView\u artist=(textView)vi.findViewById(R.id.textView\u song\u artistname);
viewHolder.textView\u time=(textView)vi.findViewById(R.id.textView\u song\u time);
viewHolder.circleImageView\u albumphoto=(circleImageView)vi.findViewById(R.id.circleImageView\u Now playing\u playing);
viewHolder.circleImageView\u favorite=(circleImageView)vi.findViewById(R.id.circleImageView\u song\u favorite);
viewHolder.imageView\u play=(imageView)vi.findViewById(R.id.imageView\u song\u playpause);
}否则{
viewHolder=(viewHolder)vi.getTag();
}
如果(data.size()在内部添加vi.setTag(p):

if(convertView == null){
 vi.setTag(p);
}
在内部添加vi.setTag(p):

if(convertView == null){
 vi.setTag(p);
}
移动

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);**
移动

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);**
对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()方法的最后一部分

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

对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()方法的最后一部分


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

如果视图持有者为空,则为视图持有者设置标记。添加最后一行代码

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

如果视图持有者为空,请为视图持有者设置标记。添加最后一行代码

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

我知道他在if块之后设置标记,所以他将如何获得标记,请检查OP提供的代码这里是v1.setTag(p)在ConvertView的if块中,我将媒体对象设置为标记,因为我在单击项目时需要该对象。当你单击项目时,你获得位置,并且从该位置可以从arraylistYeah检索项目。你是对的。但是你的解决方案在这里不起作用。我知道他正在设置if块后的标记,因此他将如何获得标记,请检查代码OP给出了v1.setTag(p)在ConvertView的if块中,我将媒体对象设置为标记,因为我在单击项时需要该对象。当您单击项时,您可以获得位置,并且从该位置可以从arraylistYeah检索项。您是对的。但是您的解决方案在这里不起作用。当我使用自定义适配器与listview绑定时,它会在每7t后复制项h位置。这可能有助于您了解更多有关问题的信息。我早些时候尝试了您的第一个解决方案,它正在工作。谢谢-无当我使用自定义适配器与listview绑定时,它会在每第7个位置后显示重复项。这可能有助于您了解更多有关问题的信息。我早些时候尝试了您的第一个解决方案,它正在工作。谢谢-无正在工作。当我使用自定义适配器与listview绑定时,它会在每7个位置后复制项目。这可能有助于您了解更多有关问题的信息尝试此@DharmeshDhameliyaI尝试了此解决方案并进行了一些其他更改。然后它就工作了。谢谢--Dalvinder SinghIt不工作。当我使用自定义适配器与listview绑定时当它在每7个位置后复制项目时。这可能会帮助您了解更多问题尝试这个@DharmeshDhameliyaI尝试了这个解决方案并做了一些其他更改。然后它成功了。谢谢——Dalvinder Singh